AcceptヘッダーなしでリクエストがAPIに送信された場合、JSONをデフォルト形式にしたいと思います。コントローラーには、XML用とJSON用の2つのメソッドがあります。
@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ヘッダーが提供されていない場合にgetJsonData
メソッドを呼び出すようにSpring MVCに指示する方法はありますか?
編集:
defaultContentType
には、トリックを行うContentNegotiationManagerFactoryBean
フィールドがあります。
Spring documentation から、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
にあるデフォルトのメソッドのために非推奨になりました。
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>