web-dev-qa-db-ja.com

Acceptヘッダーが提供されていないSpring MVCでデフォルトのコンテンツタイプを設定するにはどうすればよいですか?

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フィールドがあります。

26
user86834

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にあるデフォルトのメソッドのために非推奨になりました。

26

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>
12
Larry.Z