반응형

프로젝트에서 적용한 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을 예제로 포스팅할게요.

2020/08/19 - [개발] - Java Custom Annotation

반응형

+ Recent posts