SPR-6466 - ContentNegotiatingViewResolver can not handle View implementations returning null as content type
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@2543 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
parent
d7906963a3
commit
bc327a000e
|
|
@ -350,12 +350,15 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport
|
||||||
}
|
}
|
||||||
|
|
||||||
for (View candidateView : candidateViews) {
|
for (View candidateView : candidateViews) {
|
||||||
MediaType viewMediaType = MediaType.parseMediaType(candidateView.getContentType());
|
String contentType = candidateView.getContentType();
|
||||||
for (MediaType requestedMediaType : requestedMediaTypes) {
|
if (StringUtils.hasText(contentType)) {
|
||||||
if (requestedMediaType.includes(viewMediaType)) {
|
MediaType viewMediaType = MediaType.parseMediaType(contentType);
|
||||||
if (!views.containsKey(requestedMediaType)) {
|
for (MediaType requestedMediaType : requestedMediaTypes) {
|
||||||
views.put(requestedMediaType, candidateView);
|
if (requestedMediaType.includes(viewMediaType)) {
|
||||||
break;
|
if (!views.containsKey(requestedMediaType)) {
|
||||||
|
views.put(requestedMediaType, candidateView);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -280,4 +280,29 @@ public class ContentNegotiatingViewResolverTests {
|
||||||
verify(viewResolverMock1, viewResolverMock2, viewMock1, viewMock2, viewMock3);
|
verify(viewResolverMock1, viewResolverMock2, viewMock1, viewMock2, viewMock3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void resolveViewContentTypeNull() throws Exception {
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test");
|
||||||
|
request.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
|
||||||
|
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
|
||||||
|
|
||||||
|
ViewResolver viewResolverMock = createMock(ViewResolver.class);
|
||||||
|
viewResolver.setViewResolvers(Collections.singletonList(viewResolverMock));
|
||||||
|
|
||||||
|
View viewMock = createMock("application_xml", View.class);
|
||||||
|
|
||||||
|
String viewName = "view";
|
||||||
|
Locale locale = Locale.ENGLISH;
|
||||||
|
|
||||||
|
expect(viewResolverMock.resolveViewName(viewName, locale)).andReturn(viewMock);
|
||||||
|
expect(viewMock.getContentType()).andReturn(null);
|
||||||
|
|
||||||
|
replay(viewResolverMock, viewMock);
|
||||||
|
|
||||||
|
View result = viewResolver.resolveViewName(viewName, locale);
|
||||||
|
assertNull("Invalid view", result);
|
||||||
|
|
||||||
|
verify(viewResolverMock, viewMock);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue