반응형
프로젝트에서 적용한 Java vaildation을 포스팅하려고 해요.
보통 Front단에서 vaildation을 하는데 Server단에서도 적용을 하자고 하여 org.springframework.validation을 사용하게 되었어요
예를 들어 Controller에서 사용자 정보 추가를 한다고 하면
public ResponseEntity<HttpResponse<String>> add(
HttpServletRequest req,
HttpServletResponse res,
HttpSession session,
ModelMap model,
@Valid @RequestBody User user,
BindingResult result,
)
저기 소스에서 @Valid, BindingResult는 꼭 순서를 지켜야 해요.
User class안에 정의된 annotation으로 규칙에 어긋난 값은 BinBindingResult에 담겨서 Controller로 자동으로 넘어와요.
List<ObjectError> allErrors = result.getAllErrors();
for (ObjectError error : allErrors) {
String errorMessage = error.getDefaultMessage();
String key = errorMessage.substring(0, errorMessage.lastIndexOf(".")).replaceAll(CommonConstants.VALIDATION_MESSASGE_PREFIX, "");
System.out.println("key=="+key);
}
이런 식으로 하면 에러가 발생한 User class변수명을 가져올 수 있어요. 그러면 변수명으로 각 프로젝트에 맞게 사용이 가능해요. 만약 annotation으로 check가 불가능한 경우
BindingResult r = new DirectFieldBindingResult(User.builder().build(), "user");
if (조건) {
objectError = new ObjectError("user", "메세지");
r.addError(objectError);
}
위 코드처럼 조건을 추가하여 BindingResult를 넘기면 annotation으로 넘어온 것처럼 메시지가 추가되어서 넘아가요.
화면으로 넘길 때는
Failure failure = Failure.VALIDATION;
throw new HttpException(BeanConverter.toJson(errors),HttpStatus.BAD_REQUEST,failure);
public enum Failure {
ERROR("error"), VALIDATION("validation");
private String value;
private Failure(String value) {
this.value = value;
}
public String value() {
return value;
}
}
public class HttpException extends ServletException {
private static final long serialVersionUID = 1L;
private HttpStatus httpStatus;
private Failure failure = Failure.ERROR;
private String message;
public HttpException(String message, HttpStatus httpStatus, Failure failure) {
super(message);
this.message = message;
this.httpStatus = httpStatus;
this.failure = failure;
}
}
728x90
BeanConverter.toJson는 JSON으로 만들어서 화면으로 넘겨주고 있어요
public String toJson(Object bean) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String jsonString = null;
if (StringUtils.isEmpty(bean)) {
jsonString = null;
} else {
jsonString = mapper.writeValueAsString(bean);
}
return StringUtils.isEmpty(jsonString) ? "{}" : jsonString;
}
화면에서는 failure가 "validation"값이면 넘어온 Json값을 찍어주고 있어요.
$( document ).ajaxError(function( event, request, settings ) {
if (request.status == 401) {
} else if (request.status == 500) {
} else if (request.status == 400) {
if (settings.dataType == "json") {
var result = JSON.parse(request.responseText);
var body = result.body;
try {
body = eval(result.body);
} catch(e) {}
if (result.failure == "validation") {
for (var i = 0; i < body.length; i++) {
$._common.alert(body[i].message);
}
} else {
$._common.alert(body);
}
} else {
$._common.alert("잘못된 요청입니다.");
}
} else if (request.status == 412) {
} else {
}
});
다음에 User Class에 걸린 Annotation을 예제로 포스팅할게요.
반응형
'개발 > Java' 카테고리의 다른 글
egov 3.9버전 mybatis association 사용시 에러(org.apache.ibatis.javassist.util.proxy.SecurityActions.setAccessible) (0) | 2020.11.19 |
---|---|
Java Jpa Specifications사용하기 (0) | 2020.09.23 |
ksoap2이용하여 SOAP API가져오기 (0) | 2020.09.14 |
Java Custom Annotation (0) | 2020.08.19 |
자바 카카오 로그인(OPEN ID) (2) | 2020.08.12 |