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'ヘッダー付き):
ライブラリを含むプロジェクトのレイアウトは次のとおりです。
使っています:
ありがとう!
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を使用しています。それはあなたが注意する必要がある主なものです。
このページと他のページの両方で多くの答えを調べましたが、役に立ちませんでした。これは実際に私のために働きました:
メソッド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>
REST call contentTypeを確認してください。jsonデータをPOJOクラスに渡す場合は、contentType: 'application/json'である必要があります。
私は内部で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を使用している場合のクラスパスの競合が原因です。理解するのが本当に難しい。