我如何影响通过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/xml
或application/json
。这样,所有处理都应直接进入已配置的消息转换器。但是我不知道篡改请求标头的合理方法。谢谢。
最佳答案
由于HttpMessageConverter
的选择使用Accept
请求标头,因此实现内容协商的最简单方法是用URL扩展名指定的所需媒体类型替换此标头。
可以将其实现为Filter
(使用HttpServletRequestWrapper
替换标头值),也可以按照SPR-7517中的建议覆盖AnnotationMethodHanlderAdapter.createHttpInputMessage()
来实现(需要Spring 3.0.2)。
另请参见SPR-6993。