如何在没有Accept标头的Spring MVC中设置默认内容类型?

时间:2013-08-12 14:13:41

标签: http rest spring-mvc content-negotiation

如果在没有Accept标头的情况下向我的API发送请求,我想将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字段可以解决问题。

2 个答案:

答案 0 :(得分:23)

Spring documentation开始,您可以使用Java配置执行此操作:

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

如果您使用的是Spring 5.0或更高版本,请扩展WebMvcConfigurer而不是WebMvcConfigurerAdapter。由于WebMvcConfigurerAdapter中的默认方法,WebMvcConfigurer已被弃用。

答案 1 :(得分:12)

如果使用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>