SW-PRODUCT/개발-웹닭·HTTP

Spring validation - @ResponseBody

굴돌 2014. 12. 23. 22:05


@ResponseBody와 연계해서 validation을 하고 싶은 경우

대부분의 Spring 가이드 문서는 별로 도움이 안된다.


spring은 태생이 html을 만드는데 적합하기 때문에...그리고 html 페이지 만드는 것을 기본으로 하고 있기 때문에

@ResponseBody로 json or xml 간에 왔다갔다를 자동으로 해야 하는 경우 문제가 하나 있다.

바로 controller에 들어오지 않고 바로 튕겨져 나가며, HTML 에러 페이지가 보인다는 것이다.


이를 해결하려면 아래 코드처럼 BindingResult 타입의 파라메터를 handler method에 추가하는 방법이 있는데...

웃긴게 

HttpSetvletResponse 뒤에 BindingResult 타입 파라메터를 선언해두면 인식을 못한다.

아래 코드처럼 response 앞에 bindingResult를 두면 method 안으로 진입해 들어오기 때문에

이런저런 validation 수행한 후에 response.status 코드만 바꿔 리턴해주는 방식으로

spring이 일반적인 @ResponseBody 처리하듯이 xml or json을 마음껏 오갈 수 있다.


비슷한 방식으로 @ResponseBody 없이 ContentNegotiationManager를 사용할때도 응용 가능하다.


그런데...해보면 해볼수록 html 처리 메소드는 html 결과만 다루고 API 처리할 메소드는 json or xml만 다루는게 정신건강과 깔끔한 프레임워크를 위해 좋은 것 같다..



@RequestMapping("/list2")

@ResponseBody

public Object updateLevel(@Validated({Default.class, UpdateLevel.class}) AdminInfo adminInfo, BindingResult bindingResult, HttpServletResponse response) {

  logger.info("ss");

  if( bindingResult.hasErrors() ) {

    logger.info("ssaa:"+bindingResult);

    response.setStatus( HttpServletResponse.SC_BAD_REQUEST );

    return new ResponseMessage("you may not know");

  }

  return new ResponseMessage("ok");

}