如果在没有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
字段可以解决问题。
答案 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>