Как установить тип содержимого по умолчанию в Spring MVC без заголовка Accept?
Если запрос отправлен в мой 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
, чего я не хочу. Есть ли способ сообщить Spring MVC вызвать метод getJsonData
, если заголовок Accept отсутствует?
EDIT:
В ContentNegotiationManagerFactoryBean
есть поле defaultContentType
, которое делает трюк.
Ответы
Ответ 1
Из документации Spring вы можете сделать это с помощью Java config следующим образом:
@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
.
Ответ 2
Если вы используете 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>