Spring MVCのコンテンツネゴシエーション

Spring MVCコンテンツネゴシエーション

1. 概要

この記事では、Spring MVCプロジェクトでコンテンツネゴシエーションを実装する方法について説明します。

一般に、リクエストのメディアタイプを判断するには、次の3つのオプションがあります。

  • リクエストでURLサフィックス(拡張子)を使用する(例:.xml/.json

  • リクエストでURLパラメータを使用する(例:?format=json

  • リクエストでAcceptヘッダーを使用する

デフォルトでは、これはSpringコンテンツネゴシエーションマネージャーがこれら3つの戦略を使用しようとする順序です。 これらのいずれも有効になっていない場合は、デフォルトのコンテンツタイプへのフォールバックを指定できます。

2. コンテントネゴシエーション戦略

必要な依存関係から始めましょう。JSON表現とXML表現を使用しているため、この記事ではJSONにJacksonを使用します。


    com.fasterxml.jackson.core
    jackson-core
    2.7.2


    com.fasterxml.jackson.core
    jackson-databind
    2.7.2

XMLサポートには、JAXB、XStream、または新しいJackson-XMLサポートのいずれかを使用できます。

an earlier article onHttpMessageConverters,でのAcceptヘッダーの使用について説明したので、最初の2つの戦略に焦点を当てましょう。

3. URLサフィックス戦略

デフォルトでは、この戦略は無効になっていますが、フレームワークはURLから直接パス拡張をチェックして、出力コンテンツタイプを決定できます。

構成に入る前に、例を簡単に見てみましょう。 典型的なSpringコントローラには、次のシンプルなAPIメソッド実装があります:

@RequestMapping(
  value = "/employee/{id}",
  produces = { "application/json", "application/xml" },
  method = RequestMethod.GET)
public @ResponseBody Employee getEmployeeById(@PathVariable long id) {
    return employeeMap.get(id);
}

JSON拡張機能を使用して呼び出し、リソースのメディアタイプを指定します。

curl http://localhost:8080/spring-mvc-basics/employee/10.json

JSON拡張機能を使用した場合に返される可能性があるものは次のとおりです。

{
    "id": 10,
    "name": "Test Employee",
    "contactNumber": "999-999-9999"
}

そして、これがリクエストの内容です–XMLでのレスポンスは次のようになります。

curl http://localhost:8080/spring-mvc-basics/employee/10.xml

応答本文:


    999-999-9999
    10
    Test Employee

Now:

ここで、if we do not use any extensionを使用するか、構成されていないものを使用します–デフォルトのコンテンツタイプが返されます。

curl http://localhost:8080/spring-mvc-basics/employee/10

次に、Java構成とXML構成の両方でこの戦略を設定する方法を見てみましょう。

3.1. Java設定

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(true).
    favorParameter(false).
    ignoreAcceptHeader(true).
    useJaf(false).
    defaultContentType(MediaType.APPLICATION_JSON);
}

詳細を見ていきましょう。

まず、パス拡張戦略を有効にします。

次に、URLパラメータ戦略とAcceptヘッダー戦略を無効にします。これは、コンテンツのタイプを決定するパス拡張方法のみに依存するためです。

次に、Java ActivationFrameworkをオフにします。 JAFは、着信要求が構成した戦略のいずれにも一致しない場合に、出力形式を選択するためのフォールバックメカニズムとして使用できます。 JSONをデフォルトのコンテンツタイプとして構成するため、これを無効にします。

最後に、JSONをデフォルトに設定しています。 つまり、2つの戦略のいずれも一致しない場合、すべての着信要求はJSONを提供するコントローラーメソッドにマッピングされます。

3.2. XML構成

XMLのみを使用して、同じ正確な構成を簡単に見てみましょう。


    
    
    
    
    

4. URLパラメータ戦略

前のセクションでパス拡張を使用しました。次に、パスパラメーターを使用するようにSpringMVCをセットアップしましょう。

プロパティfavorParameterの値をtrueに設定することで、この戦略を有効にできます。

これが前の例でどのように機能するかを簡単に見てみましょう。

curl http://localhost:8080/spring-mvc-basics/employee/10?mediaType=json

そして、JSON応答の本文は次のようになります。

{
    "id": 10,
    "name": "Test Employee",
    "contactNumber": "999-999-9999"
}

XMLパラメーターを使用する場合、出力はXML形式になります。

curl http://localhost:8080/spring-mvc-basics/employee/10?mediaType=xml

応答本文:


    999-999-9999
    10
    Test Employee

それでは、構成を行いましょう。ここでも、最初にJavaを使用し、次にXMLを使用します。

4.1. Java設定

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false).
    favorParameter(true).
    parameterName("mediaType").
    ignoreAcceptHeader(true).
    useJaf(false).
    defaultContentType(MediaType.APPLICATION_JSON).
    mediaType("xml", MediaType.APPLICATION_XML).
    mediaType("json", MediaType.APPLICATION_JSON);
}

この構成を読んでみましょう。

まず、もちろん、パス拡張とAcceptヘッダー戦略が無効になります(JAFも同様)。

残りの構成は同じです。

4.2. XML構成


    
    
    
    
    
    

    
        
            
            
        
    

また、同時にboth strategies (extension and parameter) enabledを持つこともできます。

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(true).
    favorParameter(true).
    parameterName("mediaType").
    ignoreAcceptHeader(true).
    useJaf(false).
    defaultContentType(MediaType.APPLICATION_JSON).
    mediaType("xml", MediaType.APPLICATION_XML).
    mediaType("json", MediaType.APPLICATION_JSON);
}

この場合、Springは最初にパスの拡張子を探し、存在しない場合はパスのパラメーターを探します。 入力リクエストでこれらの両方が利用できない場合、デフォルトのコンテンツタイプが返されます。

5. Acceptヘッダー戦略

Acceptヘッダーが有効になっている場合、Spring MVCは着信要求でその値を検索して、表現タイプを判別します。

このアプローチを有効にするには、ignoreAcceptHeaderの値をfalseに設定する必要があります。また、Acceptヘッダーのみに依存していることがわかるように、他の2つの戦略を無効にします。

5.1. Java設定

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(true).
    favorParameter(false).
    parameterName("mediaType").
    ignoreAcceptHeader(false).
    useJaf(false).
    defaultContentType(MediaType.APPLICATION_JSON).
    mediaType("xml", MediaType.APPLICATION_XML).
    mediaType("json", MediaType.APPLICATION_JSON);
}

5.2. XML構成


    
    
    
    
    
    

    
        
            
            
        
    

最後に、コンテンツネゴシエーションマネージャーを設定全体にプラグインして切り替える必要があります。

6. 結論

これで完了です。 Spring MVCでコンテンツネゴシエーションがどのように機能するかを見て、コンテンツタイプを決定するためにさまざまな戦略を使用するように設定するいくつかの例に注目しました。

この記事の完全な実装はthe github projectにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。