ContentNegotiatingViewResolver에서 view를 못 찾을 때.
Spring2010. 8. 9. 09:32
ValidJsonView라고 'application/json'타입의 view를 리턴해주는 Custom view 클래스를 만들었다.
스프링이 BindException이 발생 하면, Error 정보를 json형태로 리턴해 주는 것이었는데, 직접 Controller Url을 치고 들어가면 view를 찾는데, 폼인 상태에서 url로 액션을 날리면 view를 못 찾는 것이었다.
하여, 디버깅해본 결과, ContentNegotiatingViewResolver에서 view를 못 찾는 것이었다.
해서 ContentNegotiatingViewResolver 소스를 살펴 보니.
ValidJsonView에는 따로 컨텐츠 타입을 설정 하지 않아서, ContentNegotiatingViewResolver에서 DefaultView로 설정해 둔
mappingJacksonView를 사용하고 있었다.
해서
스프링이 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에서 설정한 컨텐츠 타입을 찾아서 그에 맞는 뷰를 리턴하는 것을 볼 수 있었다.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;
}
ValidJsonView에는 따로 컨텐츠 타입을 설정 하지 않아서, ContentNegotiatingViewResolver에서 DefaultView로 설정해 둔
mappingJacksonView를 사용하고 있었다.
해서
public ValidationJsonView() {
setContentType("application/json");
};
부모 클래스(AbstractView)에 setContentType을 설정해서 해결 하였다.setContentType("application/json");
};