web-dev-qa-db-ja.com

POST to Jersey REST service getting error 415 Unsupported Media Type

JerseyとTomcatでJAX-RS Webアプリケーションを使用しています。取得リクエストは問題ありませんが、JSONを投稿しようとすると、HTTPステータス415-Unsupported Media Typeが返されます。

これが私のシンプルなHelloWorld.Javaです。

package service;

import javax.ws.rs.*;

@Path("hello")
public class HelloWorld {
    @GET
    @Produces("text/plain")
    public String get() {
        return "hello world";
    }

    @POST
    @Consumes("application/json")
    public String post(JS input) {
        return input.hello;
    }

    public static class JS {
        public String hello;
    }
}

これが私がPostmanで試すリクエストです( 'application/json'ヘッダー付き):

enter image description here ライブラリを含むプロジェクトのレイアウトは次のとおりです。 enter image description here

使っています:

  • Java 7 x64
  • ジャージー2.17
  • Tomcat 7.0.62 x64

ありがとう!

12
Rob Crocombe

Jerseyディストリビューションには、JSON/POJOサポートが付属していません。依存関係/ jarを追加する必要があります。

これらをすべて追加

Mavenを使用すると、以下は上記のすべてを引き出します

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.17</version>
</dependency>

Jersey 2.17を使用しない(およびMavenの代わりに直接jarを使用する)将来の読者は、 here を使用して、使用しているJerseyバージョンを見つけ、必要な推移的な依存関係バージョンを確認できます。このJersey依存関係の現在のバージョンは、Jackson 2.3.2を使用しています。それはあなたが注意する必要がある主なものです。

44
Paul Samsotha

このページと他のページの両方で多くの答えを調べましたが、役に立ちませんでした。これは実際に私のために働きました:

メソッド1:JSONObjectをパラメーターとしてリソースメソッドに渡す代わりに、Stringを渡します。 Stringを取得してJSONObjectを作成し、コードで使用できます。そのようです、

    @Path("/people")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response doGetperson(String jsonRequest) {
        try { 
            JSONObject requestedJSON = new JSONObject(jsonRequest);

            //So now you can use requestedJSON object created to do your stuff

            return Response.ok("{\"name\":" + requestedJSON.getString("user") + "}").build();
        } catch (Exception ex) {  
            return Response.ok("{ \"name\":\"\"}").build();
        } 
    }

方法2:

2017年9月の時点でこの依存関係を追加しています:

<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-moxy -->
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.26</version>
</dependency>

ここからの参照

2
Young Emil

REST call contentTypeを確認してください。jsonデータをPOJOクラスに渡す場合は、contentType: 'application/json'である必要があります。

1
Suresh Patil

私は内部でgson(JSON)APIとjersey JSONデータバインディングを使用しているfirebase APIを使用していたため、jersey-media-json-jackson-2.29.jarが必要でした。デフォルトのクラスパスは、Firebase gson APIを最初のJSON APIとして保持していたため、機能していませんでした。

クラスパスシーケンスのmanifest.mfを変更すると、問題が解決しました。このシナリオではMavenを続行できず、MavenでビルドしたwarのManifest.mfにカスタムクラスパスを追加する方法として理解できませんでした。

動的WebプロジェクトのManifest.mfのクラスパスエントリの下に追加されました。私のプロジェクトのソースをコピーして、mavenのjarファイルをweb-inf\libにソースおよびダウンロードしました。 EclipseファイルをWARファイルとして使用してwarを作成しました。

クラスパス:jersey-media-json-jackson-2.29.jar jackson-databind-2.9.9.jar gson-2.6.2.jar json-20160212.jar google-http-client-gson-1.21.0.jar

その他のエラーのほとんどは、プロジェクトで複数のAPIを使用している場合のクラスパスの競合が原因です。理解するのが本当に難しい。

0
Deepali Maniyar