メッセージ:タイプ:Java.util.ArrayListの応答オブジェクトのMessageBodyWriterが見つかりませんでした:メディアタイプ:application/json
説明:サーバーで内部エラーが発生しました(メディアタイプ:application/jsonのタイプ:Java.util.ArrayListの応答オブジェクトのMessageBodyWriterが見つかりませんでした)。これにより、サーバーはこの要求を実行できませんでした。
@GET
@Path("/{userName}/questions")
//@Produces("application/json")
public Response getUserQuestions(@PathParam("userName") String userName){
UserDAO userDAO = new UserDAO();
List<Question> questions = userDAO.getUserQuestionsByUserName(userName);
GenericEntity<List<Question>> entity = new GenericEntity<List<Question>>(questions){};
return Response.status(200).entity(entity).type(MediaType.APPLICATION_JSON).build();
}
クラスパスに安らかなジャクソンプロバイダーがあります。戻り値の型の形式をArrayList
からList
に変更し、 resteasy response に基づいてGenericEntity
でラップしようとしましたが、それでも同じ問題が発生します。
Tomcat7で実行しています。
ありがとう。
最終的に、jsonに依存する代わりにGson library
を使用してそれを解決しました。 GenericEntityでもラップしませんでした。これが機能するコードです
@GET
@Path("/{userName}/questions")
public Response getUserQuestions(@PathParam("userName") String userName){
UserDAO userDAO = new UserDAO();
List<Question> questions = userDAO.getQuestionsByUserName(userName);
Gson gson = new GsonBuilder().setExclusionStrategies(new UserQuestionsExclStrat()).create(); //.serializeNulls()
String json = gson.toJson(questions);
System.out.println(json);
return Response.status(200).entity(json).build();
}
循環参照を回避するために除外戦略を使用する必要がありました。そのためのリンクは次のとおりです。 json変換中のスタックオーバーフローエラー(休止状態の双方向マッピング)
クラスパスにresteasy-jackson-provider.jarを追加することで、この例外を解決しました。参照 https://bitbucket.org/arcbees/gaestudio/issue/2/need-resteasy-jackson-provider-on
ArrayListで使用されるクラスに@XMLRootElementを追加することで、同じ問題が解決されました。
この依存関係を追加することで、この問題を解決することができました。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.10.1</version>
</dependency>