在Spring框架中使用@RequestMapping时如何匹配通配符接受标头

时间:2011-06-08 13:02:14

标签: java spring-mvc http-headers

我有三个资源:

   @RequestMapping(value = "sample", method = RequestMethod.GET, headers = "Accept=text/html")
   public ResponseEntity<String> sampleResourceHtml()

   @RequestMapping(value = "sample", method = RequestMethod.GET, headers = "Accept=application/xml")
   public ResponseEntity<String> sampleResourceXml()

   @RequestMapping(value = "sample", method = RequestMethod.GET, headers = "Accept=application/json")
   public ResponseEntity<String> sampleResourceJson()

当HTTP客户端使用Accept = * / *访问url时,webapp会返回404

在这种情况下,我想调用sampleResourceHtml()

"Accept=text/html"更改为"Accept=text/html, */*"会使我的webapp接受带有Accept = * / *的请求,这是我想要的,但它也会接受Accept = foo / bar的请求,这不是我的意思想。

如何修改我的代码,以便为包含通配符的请求返回支持的媒体类型,而不会为不支持的请求返回意外的媒体类型?

1 个答案:

答案 0 :(得分:2)

您可能会发现使用AnnotationMethodHandlerAdapter在上下文中更容易配置它,以便自动处理 Accept 标头并由Spring完成转换,而不是以编程方式完成。

例如,您可以使用以下配置:

             

<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"/>
  <bean id="xmlMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
  <constructor-arg ref="xstreamMarshaller"/>
</bean>
<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="messageConverters">
    <util:list>
      <ref bean="xmlMessageConverter"/>
      <ref bean="jsonHttpMessageConverter"/>
    </util:list>
  </property>
</bean>

修改控制器以返回Spring将转换为所需类型的对象。

@RequestMapping(value = "sample", method = RequestMethod.GET)
public ResponseEntity<String> sampleResource()

注意:您需要类路径上的相关库。