私の問題が何であるかを理解しようとした後、私は最終的にあなたに私の問題を解決する方法を尋ねることにしました。私は同じ問題を抱えるさまざまな人々を見てきましたが、彼らがするようにアドバイスされたすべてのことを試しましたが、私の問題には何も助けませんでした。基本的に、私はジャージーを使用して構築するRESTfulサービスを持っています。私のクライアントでは、オブジェクトをJSON形式で返したいと思います。さまざまなチュートリアルを読んで、jersey-json-1.8ライブラリを使用するのが理にかなっていると判断しました。私はいつも通りにプロジェクトにすべてを追加して実行しようとしましたが、サービスを呼び出すたびに(get request atmを介して)HTTPエラーコード500(内部サーバーエラー)を取得し、サーバーはメッセージ本文がありませんと応答します作家が見つかりました。 XMLを返す場合、問題なく動作し、すべてが素晴らしいです。 jersey-json-1.8.jarをTomcat libフォルダーにコピーしようとしました。使用しているmysql libでこれを行う必要がありましたが、どちらも助けにはなりませんでした。このようなものを機能させるためにあなたが私を助けてくれたら本当にうれしいです!さらに情報が必要な場合は、コメントを残してください。私はできるだけ早くそれを提供します:)
私のプロジェクトのセットアップは次のとおりです。3つの異なるパッケージ1.私のRESTfulServices 2.私のJava私はSQL接続などを処理する場所で作業します。 JSON形式で返したいこと(私の例ではテストドライブのルート)
Tomcat Webserver IDE:Mavenを使用しているEclipse
何をどのようにオブジェクトを返そうとしても機能しません。常にエラーメッセージが表示されます。
Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: A message body writer for Java class com.mykong.models.Teststrecke, and Java type class com.mykong.models.Teststrecke, and MIME media type application/json was not found
編集:これは私のJSONサービスメソッドです
@Path("/hellojson")
public class JSONService {
@GET
@Produces(MediaType.APPLICATION_JSON)
public ArrayList<Route> getJSONMsg()
{
Route ts = new Route();
ts.setId(1);
ts.setName("HelloWorld");
Route ts2 = new Route();
ts2.setId(2);
ts2.setName("HelloWorld");
ArrayList<Route> availRoutes = new ArrayList<Route>();
availRoutes.add(ts);
availRoutes.add(ts2);
return availRoutes;
}
}
クラスパスにGensonライブラリを追加してみてください http://owlike.github.io/genson/ 。 json <> JavaストリーミングおよびデータバインディングAPIです。それはジャージとうまく統合されており、実行するためには0の設定が必要です。 Jerseyは、ライブラリがクラスパスにあることを検出し、Gensonに委任することでjsonマッピングを有効にします。
この依存関係をPOM.xmlに含めて、Maven-> Updateを実行します
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency>
以下の依存関係を追加することで問題が解決しました。 @eugenに従って、例外を取り除くのに役立つGenson
依存関係を追加しようとしましたが、何らかの理由でサーバーが400の悪いリクエストを投げていました。 Genson
はjsonリクエストを適切にストリーミングできなかったようです。しかし、以下の依存関係は問題なく機能しました。この問題が私を夢中にさせていたので、それが他の人を助けることを願っています!
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.3.0</version>
</dependency>
移動jersey-json
pom.xmlの先頭への依存関係により、この問題は解決されました。
<dependencies>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.18.1</version>
</dependency>
<!-- other dependencies -->
</dependencies>
Package ExplorerのMaven Dependenciesで確認します。jersey-bundle-1.8.jarが表示されない場合は、jersey-serverのみを指定している可能性があります。 pom.xmlの依存関係をjersey-bundleに変更すると、動作するはずです。
Jersey 2.4:私もこの問題に直面しており、誰かに役立つようにこれを投稿しています。これをJSON統合のためのJersey API仕様から選択しました:( https://jersey.Java.net/documentation/latest/user-guide.html#json )
私はJettisonを使用してJSONでJerseyと統合しました。しかし、すべてのライブラリを追加した後でもエラーが発生しました:Java ClassおよびMIME mediatype application/jsonのメッセージ本文ライターが見つかりませんでした
適切なライブラリの追加と機能の登録に関するすべて>私は、Jerseyが提供する他のすべてのライブラリに加えて、jersey-media-json-jettison-2.4.jarの1つの追加ライブラリを追加しました。そして、Jettison Featureを登録するために以下のコードを追加しました。
public class MyApplication extends ResourceConfig{
public MyApplication() {
register(JettisonFeature.class);
packages("org.XXX.XXX.XXX");
}
上記の問題は、gensonの代わりにjacksonライブラリを使用することで解決されます。
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>
私の場合のように、gensonは応答で空のjsonを与えていましたが、jsonを文字列に変換している場合は問題ありませんが、応答ではjsonではなく文字列を取得するため、望ましくない出力が作成されます。非常に簡単に実行できるジャクソンライブラリ。
注:Jacksonは、クラスがSerializable Interfaceを実装している場合にのみ、jsonへの応答を変換します。
@Produces(MediaType.APPLICATION_JSON)を削除します。 JSONLibraries.Zipファイルを使用して、データをJSONとやり取りします。上記のコードの問題は、mavenとjacksonの組み合わせを使用していることです。そのため、ジャージのみを使用している場合、APPLICATION_JSONは見つかりません。私はJSON変換との間で作業しました、それは私に同じエラーを与えました、私はこのソリューションで試してみましたが、それは適切に機能していました。
コード:
@Path("/hellojson")
public class JSONService {
@GET
public ArrayList<Route> getJSONMsg()
{
Route ts = new Route();
ts.setId(1);
ts.setName("HelloWorld");
Route ts2 = new Route();
ts2.setId(2);
ts2.setName("HelloWorld");
ArrayList<Route> availRoutes = new ArrayList<Route>();
availRoutes.add(ts);
availRoutes.add(ts2);
return JSONObject.fromObject(availRoutes.toString()));
}
}
この質問は少し前に尋ねられましたが、読んでいる人のために、ジャージサーブレットコンテナには独自のPOJOマッパーがあることに注意してください。
Web.xmlに次を追加して有効にします
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
ジャージとゲンソンがオブジェクトをどのようにマップするかに、いくつかの矛盾があることに気付きました。たとえば、クラスがAを拡張するBのインスタンスに設定されているタイプAのフィールドを持っている場合、gensonはBを適切にシリアル化しませんが、ジャージはそうします。