web-dev-qa-db-fra.com

Comment définir le type de contenu par défaut dans Spring MVC dans aucun en-tête Accept n'est fourni?

Si une demande est envoyée à mon API sans en-tête Accept, je veux faire de JSON le format par défaut. J'ai deux méthodes dans mon contrôleur, une pour XML et une pour 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.  
 }

Lorsque j'envoie une demande sans en-tête Accept, la méthode getXmlData est appelée, ce qui n'est pas ce que je veux. Existe-t-il un moyen de dire à Spring MVC d'appeler la méthode getJsonData si aucun en-tête Accept n'a été fourni?

MODIFIER:

Il y a un champ defaultContentType dans le ContentNegotiationManagerFactoryBean qui fait l'affaire.

26
user86834

Depuis la documentation Spring , vous pouvez le faire avec Java config comme ceci:

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

Si vous utilisez Spring 5.0 ou version ultérieure, étendez WebMvcConfigurer au lieu de WebMvcConfigurerAdapter. WebMvcConfigurerAdapter a été déconseillé en raison des méthodes par défaut qui sont dans WebMvcConfigurer.

26
RustyTheBoyRobot

Si vous utilisez spring 3.2.x, ajoutez-le simplement à 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>
12
Larry.Z