param @NotEmpty 어노테이션은 그대로도 빈 값을 잡아 에러로 띄워주지만, 에러를 원하는 item의 형태로 직접 처리하고 싶다던가 하는 이유로 수동으로 확인하고자 아래와 같은 코드를 짜보았다.
막상 짰지만 쓰진 않았다.. 결국 그냥 기본 에러(MethodArgumentNotValidException)를 사용했지만.. 기록겸 남겨둔다.
Source Code for (Single) Param
전체 소스 코드이다.
private PartnerCodeItem validateMandatoryFields(Object obj) { //obj에는 Param를 넘겨줌
Field[] fields = obj.getClass().getDeclaredFields(); //obj의 모든 필드를 가져옴
for (Field field : fields) { //모든 필드를 하나씩 확인
if (field.isAnnotationPresent(NotEmpty.class)) { //필드에 NotEmpty 어노테이션이 붙어 있는지 확인
field.setAccessible(true); //해당 필드가 private나 protect일 수 있으므로 강제로 값에 접근할 수 있도록 함
try {
Object value = field.get(obj); //필드의 값을 읽어옴
if (value == null || (value instanceof String && ((String)value).isBlank()) || (value instanceof List && ((List<?>)value).isEmpty())) { //값이 Empty라면
throw new BizException("SD_0000000", new Object[]{field.getName()}); //예외로 throw함 예외는 원하는 대로 처리하면 됨
}
} catch (BizException e) {
return setPartnerCodeItems(partnerCode, e); // catch에서 잡은 예외를 원하는 item형식으로 처리할 수 있도록 함
} catch (IllegalAccessException e) {
e.printStackTrace(); // 마찬가지로 처리하고 싶다면 원하는 대로 처리하면 됨
}
}
}
return null;
}
Source Code for Multi Param
다중 파람 구조를 가진 경우의 전체 소스 코드이다.
다중 파람 구조에 대한 설명은 소스 코드 아래에서 다루었다.
private PartnerCodeItem validateMandatoryFields(Object obj) {
String partnerCode = null;
Field[] fields = obj.getClass().getDeclaredFields(); //all fields in obj
for (Field field : fields) {
if (field.isAnnotationPresent(NotEmpty.class)) { //check if the @NotEmpty annotation is attached
field.setAccessible(true); //forced access to a private/protect field
try {
Object value = field.get(obj); //get value
if (value == null || (value instanceof String && ((String)value).isBlank()) || (value instanceof List && ((List<?>)value).isEmpty())) {
throw new BizException("SD_0000000", new Object[]{field.getName()});
}
if ("partnerCode".equals(field.getName())) {
partnerCode = value.toString();
}
if (value instanceof List<?>) { // recursive
List<?> subFields = (List<?>) value;
for (Object subField : subFields) {
if (subField != null) {
PartnerCodeItem subItem = validateMandatoryFields(subField); // 다중 파람 구조를 사용하여 재귀를 사용
if (subItem != null) return subItem;
}
}
}
} catch (BizException e) {
return setPartnerCodeItems(partnerCode, e);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return null;
}
Multi Param 다중 파람
Param의 클래스를 여러개 가지고 각 클래스 내부의 특정 필드가 다른 클래스 파람의 값을 갖는 경우이다.
가장 상위 Param인 PartnerCodeParam 필드의 타입으로써 하위 Param의 타입을 가지도록 설계된 구조이다.
// 최상위 Param @Getter @Setter public class PartnerCodeParam { @NotEmpty @JsonProperty("function") private String function; @NotEmpty @JsonProperty("staffCd") private String staffCd; @NotEmpty @JsonProperty("partners") private List<PartnerCodeDetailParam> partners; //PartnerCodeDetailParam라는 클래스의 파람 타입의 필드 }
//PartnerCodeParam의 partners의 타입인 하위 param @Getter @Setter public class PartnerCodeDetailParam{ @NotEmpty @JsonProperty("partnerType") private String partnerType; @NotEmpty @JsonProperty("partnerCode") private String partnerCode; @NotEmpty @JsonProperty("shortName") private String shortName; ... }