我如何影响通过URL扩展在AnnotationMethodHandlerAdapter中选择消息转换器以生成POJO的过程?
我希望有一个数据对象的更多表示形式,而数据表示形式应由所请求的url扩展名选择,例如/users/2.xml/users/2.json

消息处理程序的当前配置,应根据url扩展名进行选择:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"
                p:marshaller-ref="xmlMarshaller" p:unmarshaller-ref="xmlMarshaller" />
        </list>
    </property>
</bean>


有一种方法,我几乎可以适应并且正在使用ContentNegotiatingViewResolver,但是我想绕过视图解析过程,而直接使用消息转换器。同样,在创建动作时,在public ResponseEntity<User> showUser()中使用ResponseEntity可以对生成的http状态代码定义(OK,NOT_FOUND,NO_CONTENT等)进行精细控制。我找不到将ResponseEntity与ContentNegotiatingViewResolver结合使用的方法,该方法也可以满足我的需求。

另一种方法是根据URL扩展名将请求accept标头修改为application/xmlapplication/json。这样,所有处理都应直接进入已配置的消息转换器。但是我不知道篡改请求标头的合理方法。

谢谢。

最佳答案

由于HttpMessageConverter的选择使用Accept请求标头,因此实现内容协商的最简单方法是用URL扩展名指定的所需媒体类型替换此标头。

可以将其实现为Filter(使用HttpServletRequestWrapper替换标头值),也可以按照SPR-7517中的建议覆盖AnnotationMethodHanlderAdapter.createHttpInputMessage()来实现(需要Spring 3.0.2)。

另请参见SPR-6993

09-15 22:21