Spring中转换服务和内容协商管理器的目的是什么?

时间:2016-03-28 03:55:32

标签: spring spring-mvc

Spring中conversion-servicecontent-negotiation-manager的目的是什么?我们在Spring的appContext中有这个,但我不确定它的用途。

content-negotiation-manager

我在这里读到: http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-content-negotiation内容协商管理器就像@RequestMapping的“解析器”一样 - 例如如果我的映射URL是“/ person / create” - 它将在客户端访问/person/create.json和/person/create.html时调用(给定下面的配置)。

我也能够访问/person/list.xml并且它返回xml结果,即使在content-negotiation-manager中没有定义xml,因为我的类路径中有Jackson:

  

对于请求URI中的文件扩展名,MVC Java配置和   MVC命名空间,自动注册扩展名,如.json,.xml,   .rss和.atom如果相应的依赖项如Jackson,   JAXB2或Rome存在于类路径中。

因此,我们定义了content-negotiation-manager,因为我们支持html,默认情况下它没有映射。我的理解是否正确?

conversion-service

在我们的类中,我们有一个ObjectMapper.readValue(json, Obj.class)@RestController以xml / json格式返回一个对象,具体取决于请求(如果访问/list.xml并返回json格式,它将返回一个xml格式当你访问/list.json)。但我已经读过@RestController可以在没有转换服务的情况下工作。所以我不确定为什么它在<mvc:annotation-driven>

中提供
  <mvc:annotation-driven conversion-service="conversionService" content-negotiation-manager="contentNegotiationManager"/>

  <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

  <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="html" value="text/html"/>
        </map>
    </property>
    <property name="defaultContentType" value="application/json"/>
  </bean>

1 个答案:

答案 0 :(得分:0)

Both the conversion service and the content negotation manager are always used by Spring MVC, regardless whether you define them or not. You can configure them according to your needs. That's the case here.

E.g. name="defaultContentType" value="application/json" means that if the client doesn't prefer a specific media type the server should send back JSON.