2013-08-12 13 views
14

Jeśli żądanie jest wysyłane do mojego interfejsu API bez nagłówka Accept, chcę ustawić JSON jako domyślny format. Mam dwie metody w moim kontrolera, po jednym dla XML i jeden dla JSON:Jak ustawić domyślny typ zawartości w Spring MVC w nagłówku Accept Accept?

@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. 
} 

Kiedy wysłać żądanie bez nagłówka Accept metoda getXmlData nazywa, co nie jest to, co chcę. Czy istnieje sposób, aby powiedzieć Spring MVC, aby zadzwonić do metody getJsonData, jeśli nie podano nagłówka Accept?

EDIT:

Jest defaultContentType pola w ContentNegotiationManagerFactoryBean że załatwia sprawę.

+2

Jeśli znalazłem rozwiązanie przy użyciu 'ContentNegotiationManagerFactoryBean' dodaj go jako rozwiązanie. –

Odpowiedz

11

Jeśli używasz sprężyny 3.2.x, wystarczy dodać to do wiosny 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> 
+0

Umieściłem to w moim servlet-context.xml i działało idealnie. Dzięki @Larry Z. – UpAllNight

+0

działa na mnie 2 !!! thx – Rugal

+0

Czy ustawienie 'mediaTypes' ma jakiś wpływ, gdy' favorPathExtension' jest ustawione na 'false'? – holmis83

15

Z Spring documentation, można to zrobić z config Java jak ten:

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