Clean Code that Works.

ValidJsonView라고 'application/json'타입의 view를 리턴해주는 Custom view 클래스를 만들었다.

스프링이 BindException이 발생 하면, Error 정보를 json형태로 리턴해 주는 것이었는데, 직접 Controller Url을 치고 들어가면 view를 찾는데, 폼인 상태에서 url로 액션을 날리면 view를 못 찾는 것이었다.

하여, 디버깅해본 결과, ContentNegotiatingViewResolver에서 view를 못 찾는 것이었다.
해서 ContentNegotiatingViewResolver 소스를 살펴 보니.

private View getBestView(List<View> candidateViews, List<MediaType> requestedMediaTypes) {
        MediaType bestRequestedMediaType = null;
        View bestView = null;
        for (MediaType requestedMediaType : requestedMediaTypes) {
            for (View candidateView : candidateViews) {
                if (StringUtils.hasText(candidateView.getContentType())) {
                    MediaType candidateContentType = MediaType.parseMediaType(candidateView.getContentType());
                    if (requestedMediaType.includes(candidateContentType)) {
                        bestRequestedMediaType = requestedMediaType;
                        bestView = candidateView;
                        break;
                    }
                }
            }
            if (bestView != null) {
                if (logger.isDebugEnabled()) {
                    logger.debug(
                            "Returning [" + bestView + "] based on requested media type '" + bestRequestedMediaType +
                                    "'");
                }
                break;
            }
        }
        return bestView;

    }
view에서 설정한 컨텐츠 타입을 찾아서 그에 맞는 뷰를 리턴하는 것을 볼 수 있었다.

ValidJsonView에는 따로 컨텐츠 타입을 설정 하지 않아서, ContentNegotiatingViewResolver에서 DefaultView로 설정해 둔
mappingJacksonView를 사용하고 있었다.

해서
public ValidationJsonView() {
        setContentType("application/json");
    };
부모 클래스(AbstractView)에 setContentType을 설정해서 해결 하였다.