diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java index 1ffbb93e744..0ad603a851a 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java @@ -350,12 +350,15 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport } for (View candidateView : candidateViews) { - MediaType viewMediaType = MediaType.parseMediaType(candidateView.getContentType()); - for (MediaType requestedMediaType : requestedMediaTypes) { - if (requestedMediaType.includes(viewMediaType)) { - if (!views.containsKey(requestedMediaType)) { - views.put(requestedMediaType, candidateView); - break; + String contentType = candidateView.getContentType(); + if (StringUtils.hasText(contentType)) { + MediaType viewMediaType = MediaType.parseMediaType(contentType); + for (MediaType requestedMediaType : requestedMediaTypes) { + if (requestedMediaType.includes(viewMediaType)) { + if (!views.containsKey(requestedMediaType)) { + views.put(requestedMediaType, candidateView); + break; + } } } } diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java index 8c1ce84dd00..49d4a1869da 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolverTests.java @@ -280,4 +280,29 @@ public class ContentNegotiatingViewResolverTests { 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); + } + }