29

如果将请求发送到我的 API 时没有 Accept 标头,我希望将 JSON 设为默认格式。我的控制器中有两种方法,一种用于 XML,一种用于 JSON:

@RequestMapping(method = RequestMethod.GET,produces=MediaType.APPLICATION_ATOM_XML_VALUE)
@ResponseBody
public ResponseEntity<SearchResultResource> getXmlData(final HttpServletRequest request) {
     //get data, set XML content type in header.
 }

 @RequestMapping(method = RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
 @ResponseBody
 public ResponseEntity<Feed> getJsonData(final HttpServletRequest request){
      //get data, set JSON content type in header.  
 }

当我发送没有 Accept 标头的请求时,getXmlData会调用该方法,这不是我想要的。如果没有提供 Accept 标头,有没有办法告诉 Spring MVC 调用该getJsonData方法?

编辑:

有一个defaultContentType字段ContentNegotiationManagerFactoryBean可以解决问题。

4

2 回答 2

35

Spring 文档中,您可以使用 Java 配置执行此操作,如下所示:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
  @Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.defaultContentType(MediaType.APPLICATION_JSON);
  }
}

如果您使用 Spring 5.0 或更高版本,请实现WebMvcConfigurer而不是扩展WebMvcConfigurerAdapter. WebMvcConfigurerAdapter已被弃用,因为WebMvcConfigurer它具有默认方法(由 Java 8 实现)并且可以直接实现而无需适配器。

于 2015-10-27T19:41:11.907 回答
13

如果您使用 spring 3.2.x,只需将其添加到 spring-mvc.xml

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false"/>
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
    <property name="defaultContentType" value="application/json"/>
</bean>
于 2013-08-13T02:50:31.213 回答