多视图解析器ContentNegotiatingViewResolver

介绍

RESTful服务中很重要的一个特性即是同一资源,多种表述我们使用ContentNegotiatingViewResolver就可以做到,这个视图解析器允许你用同样的内容数据来呈现不同的view。

有三种格式:
http://www.test.com/user.xml
Accept:application/xml
http://www.test.com/user?format=xml

属性

order:如果有多个的解析器,用于设置解析器的执行顺序。

defaultContentType:如果所有的mediaType都没匹配上,就会使用defaultContentType设置的类型。

avorPathExtension:是否启用扩展名支持,默认是true。

favorParameter:是否启用参数支持,默认是true。

ignoreAcceptHeader:是否忽略掉accept header,默认是false。

mediaTypes:扩展名到mimeType的映射,里面是map。

出现的问题

我今天在配置多视图解析器的时候,发现里面的属性不一样了,根本没有mediaTypes属性,所以我百度一下后,发现全是没用的信息,我就去看了一下官方文档,官方文档里面并没有说为什么替换了mediaTypes,
但是写了可以用ContentNegotiationManager去配置扩展名的映射。

然后我看了一下源码,发现有些头疼,我又百度了一下ContentNegotiationManager,找到了样例。

从spring 3.1.0升级到spring 3.2.0时, spring3.2开始不推荐使用setMediaTypes等直接设置这些数据, 而是通过ContentNegotiationManager(ContentNegotiationManagerFactoryBean),所以采用map标签的方式直接转换会出现异常信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">  
<property name="ignoreAcceptHeader" value="true"/>
<property name="defaultContentType" value="text/html"/>
<property name="contentNegotiationManager">
<bean class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="ignoreAcceptHeader" value="true"/>
<property name="defaultContentType" value="text/html"/>
<property name="mediaTypes">
<props>
<prop key="json">application/json</prop>
<prop key="xml">application/xml</prop>
</props>
</property>
</bean>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"></property>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<bean class="org.springframework.web.servlet.view.xml.MarshallingView" >
<property name="marshaller">
<bean class="org.springframework.oxm.xstream.XStreamMarshaller"/>
</property>
</bean>
</list>
</property>
</bean>

参考链接:https://www.iteye.com/blog/langmnm-2082005