2016-08-10 8 views
2

ディスパッチャーサーブレットへのリクエストが何を試みても、HTTP 415エラーが返されます。リクエストでContent-Typeはapplication/jsonに設定されています。Spring MVC @RequestBodyは415エラーを返します

メッセージコンバータが要求をオブジェクトにマッピングしていないようです。

私はPOM内のすべてのジャクソンの依存関係を持っている:

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>${jackson-databind-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.module</groupId> 
     <artifactId>jackson-module-jaxb-annotations</artifactId> 
     <version>2.4.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.xml.bind</groupId> 
     <artifactId>jaxb-impl</artifactId> 
     <version>2.2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.xbean</groupId> 
     <artifactId>xbean-spring</artifactId> 
     <version>3.7</version> 
    </dependency> 

コントローラクラス:

@RequestMapping(value = "/login", method = RequestMethod.POST, headers = {"Accept=application/json"}, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public DriverLoginResponseDTO login(@RequestBody MyDTO dto) 
{ 
    System.out.println("login method hit!"); 
    LoginResponseDTO resp = null; 

    try { 
     resp = loginService.processLogin(dto); 
    } 
    catch (Exception cde) { 
     resp = new LoginResponseDTO(); 
     resp.setMessage("ERROR"); 
    } 

    // Return response object 
    return resp; 
} // login 

私は、受け入れ消費し、無駄に@RequestMappingに生成追加しようとしました。

私は、メソッドのパラメータとしてのHttpServletRequestで正しいJSONレスポンスを取得することができます。

@RequestMapping(value = "/login3", method = RequestMethod.POST) 
@ResponseBody 
public DriverLoginResponseDTO login3(HttpServletRequest request) 
{ 
    String line; 
    StringBuilder sb = new StringBuilder(); 

    InputStream is; 
    try { 
     is = request.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
     while ((line = reader.readLine()) != null) { 
      sb.append(line).append("\n"); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("login3 method hit!"); 
    System.out.println("JSON string received: " + sb.toString()); 

    LoginResponseDTO resp = null; 

    try { 
     resp = loginService.processLogin(new MyDTO()); 
    } 
    catch (Exception cde) { 
     resp = new LoginResponseDTO(); 
     resp.setMessage("ERROR"); 
    } 

    // Return response object 
    return resp; 
} // login 

この1つは、System.outに書かれた正しいJSON文字列を示します。上記の最初の「ログイン」メソッドでJSONリクエストをRequestBodyオブジェクトにマッピングしているものがありますが、何が欠けているのか分かりません。

これが関連しているが、WebSphereは、以下のエラーを投げている場合、私は知らない。

SRVE8094W:WARNING:ヘッダーを設定することはできませんが。応答はすでにコミットされています

+0

に代わりheaders = {"Accept=application/json"}consumes = "application/json"を設定してください。また、郵便配達員のようなレストクライアントでサービスを呼び出すこともできます。 – reos

+0

スパムがありません。あなたのAjaxリクエストコードが必要です。 – Byeon0gam

+0

_ "これは正しいJSON文字列を示しています" _これは無関係です。重要なのはメディアの種類です。 – zeroflagL

答えて

0

は、サンプルのJSONメッセージを追加し、サービスを呼び出すコードを追加してください@RequestMapping

+1

私はすでにコントローラークラスでそれを持っています。 Acceptヘッダーを追加して、役立つかどうかを確認しました。 –

関連する問題