Clean Code that Works.

Server Validation

Spring2010. 7. 26. 19:31
Server Validation을 좀 더 효율적으로 하기 위해서,
ValidationJsonView라는 클래스를 만들었다, BindingResult 가 hasError를 가지고 있을 경우에
ValidationJsonView를 리턴 하도록 하였다.

이 경우에 에러가 발생 했을 경우를 @AfterThrowing aspect 로 처리 하도록 했는데, 에러(BindingResultException)가 발생했어도 잡지를 못하는 것이었다. 이 오류는 이 AnnotationMethodHandlerExceptionResolver 가 잡아서 처리하고 있다.

하여 전에 생각으로는

//@ExceptionHandler(BindException.class)
    public ModelAndView handleValidationException( BindException ex, HttpServletResponse response) {
        logger.info(ex.getMessage());
        return new ValidationJsonView(ex, response).renderError();
    }

이 같은 형식으로 valid 오류가 발생 했을 경우 처리할 view(ValidationJsonView)를 만들어서 처리를 했었다..(2틀 -_-?)

좀 더 생각 해보니 custom resolver를 만들어서 처리 하는게 더 좋은 방법 이었다.
HanderExceptionResolver를 Implements 하여 ValidExceptionResolver를 만들어 보았다.

public class ValidExceptionResolver implements HandlerExceptionResolver {
   
    private Logger logger = LoggerFactory.getLogger(this.getClass());
   
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {
        BindException bindEx = (BindException) ex;
        setScBadRequest( response);
        logger.info( bindEx.getFieldErrors().get(0).toString());
        logger.info("Error Fields : {}", bindEx.getFieldErrors());
       
        return new ModelAndView( new MappingJacksonJsonView(), getErrorInfo( bindEx));
    }
   
    private ModelMap getErrorInfo( BindException bindEx) {
        ModelMap model = new ModelMap();
        model.addAttribute("errorType", "validError");
        model.addAttribute("errorCount", bindEx.getErrorCount());
        model.addAttribute("errors", bindEx.getFieldErrors());
        return model;
    }
   
    private void setScBadRequest( HttpServletResponse response) {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
    }

}


그럼 또 생각해 볼께.... -_-;;
저걸 설정 파일에다가 등록하면 모든 exception을 잡아서 저놈이 처리 하게된다.
이러면 안되!!! 나는 BindException 만 처리 하면 된다고!!!

하여 org.springframework.web.servlet.handler.SimpleMappingExceptionResolver 에서 특정 에러에 대한 resolver를 설정 할 수 있을까? 생각이 들어.. 한번 찾아 보았으나..

못 찾았다. -_-;;

그래서 예전에 만들어 놓았던 view 클래스를 사용 하기로 하였다.

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
               <props>
                       <prop key="org.springframework.validation.BindException">
                            validExceptionJsonView
                       </prop>
               </props>
        </property>
    </bean>


validExceptionJsonView 는 MappingJacksonJsonView를 상속하여 만들었는데, 그냥 AbstractView 상속해도 되겠다.

이정도면 정리 된거야???