Update AbstractView with method to set content type
Before this change View implementations set the response content type to the fixed value they were configured with. This change makes it possible to configure a View implementation with a more general media type, e.g. "application/*+xml", and then set the response type to the more specific requested media type, e.g. "application/vnd.example-v1+xml". Issue: SPR-9807.
This commit is contained in:
@@ -273,6 +273,35 @@ public class ContentNegotiatingViewResolverTests {
|
||||
verify(htmlViewResolver, jsonViewResolver, htmlView, jsonViewMock);
|
||||
}
|
||||
|
||||
// SPR-9807
|
||||
|
||||
@Test
|
||||
public void resolveViewNameAcceptHeaderWithSuffix() throws Exception {
|
||||
request.addHeader("Accept", "application/vnd.example-v2+xml");
|
||||
|
||||
ViewResolver viewResolverMock = createMock(ViewResolver.class);
|
||||
viewResolver.setViewResolvers(Arrays.asList(viewResolverMock));
|
||||
|
||||
viewResolver.afterPropertiesSet();
|
||||
|
||||
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("application/*+xml").anyTimes();
|
||||
|
||||
replay(viewResolverMock, viewMock);
|
||||
|
||||
View result = viewResolver.resolveViewName(viewName, locale);
|
||||
|
||||
assertSame("Invalid view", viewMock, result);
|
||||
assertEquals(new MediaType("application", "vnd.example-v2+xml"), request.getAttribute(View.SELECTED_CONTENT_TYPE));
|
||||
|
||||
verify(viewResolverMock, viewMock);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveViewNameAcceptHeaderDefaultView() throws Exception {
|
||||
request.addHeader("Accept", "application/json");
|
||||
|
||||
@@ -35,10 +35,12 @@ import org.junit.Test;
|
||||
import org.mozilla.javascript.Context;
|
||||
import org.mozilla.javascript.ContextFactory;
|
||||
import org.mozilla.javascript.ScriptableObject;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.ui.ModelMap;
|
||||
import org.springframework.validation.BindingResult;
|
||||
import org.springframework.web.servlet.View;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.BeanProperty;
|
||||
@@ -110,6 +112,22 @@ public class MappingJackson2JsonViewTests {
|
||||
validateResult();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void renderWithSelectedContentType() throws Exception {
|
||||
|
||||
Map<String, Object> model = new HashMap<String, Object>();
|
||||
model.put("foo", "bar");
|
||||
|
||||
view.render(model, request, response);
|
||||
|
||||
assertEquals("application/json", response.getContentType());
|
||||
|
||||
request.setAttribute(View.SELECTED_CONTENT_TYPE, new MediaType("application", "vnd.example-v2+xml"));
|
||||
view.render(model, request, response);
|
||||
|
||||
assertEquals("application/vnd.example-v2+xml", response.getContentType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void renderCaching() throws Exception {
|
||||
view.setDisableCaching(false);
|
||||
@@ -265,6 +283,7 @@ public class MappingJackson2JsonViewTests {
|
||||
Object jsResult =
|
||||
jsContext.evaluateString(jsScope, "(" + response.getContentAsString() + ")", "JSON Stream", 1, null);
|
||||
assertNotNull("Json Result did not eval as valid JavaScript", jsResult);
|
||||
assertEquals("application/json", response.getContentType());
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user