Как установить тип содержимого по умолчанию в 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>