単純なJersey + JSONの例を試してみましたが、次のエラーが発生しますmessage body writer for Java class com.test.jsonexample and MIME media type application/json was not found
適切な結果を得るために、次のjarファイルを配置します
asm-3.1.jar
jackson-core-asl-1.9.9.jar
jackson-jaxrs-1.9.9.jar
jackson-mapper-asl-1.9.9.jar
jackson-xc-1.9.9.jar
jersey-client-1.9.jar
jersey-core-1.9.1.jar
jersey-json-1.9.jar
jersey-server-1.9.1.jar
jettison-1.3.2.jar
jsr311-api-1.1.1.jar
このタイプのエラーが発生するのはなぜですか?エラーログは次のとおりです。
SEVERE: 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.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
at com.Sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.Java:285)
at com.Sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.Java:1437)
at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1349)
at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1339)
at com.Sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.Java:416)
at com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:537)
at com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:708)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:225)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:472)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:168)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:98)
at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:927)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:407)
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1001)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:579)
at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:312)
at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at Java.lang.Thread.run(Unknown Source)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>TestJaxRs</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.Sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>com.test.rest</param-value>
</init-param>
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
JsonExample.Java
@XmlRootElement
public class JsonExample {
String title;
String singer;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
@Override
public String toString() {
return "JsonExample [title=" + title + ", singer=" + singer + "]";
}
}
とJsonサービス
@Path("/json/metallica")
public class JSONService {
@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public JsonExample getTrackInJSON() {
JsonExample json = new JsonExample();
json.setTitle("Enter Sandman");
json.setSinger("Metallica");
return json;
}
@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
public Response createTrackInJSON(JsonExample track) {
String result = "Track saved : " + track;
return Response.status(201).entity(result).build();
}
私が何か間違ったことをしているなら、私に提案してください。
この問題はjersey-bundle-1.8.jarで修正されました
以下をpom.xmlに追加することで問題を修正しました:
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency>
ドキュメントは次の場所にあります: https://code.google.com/p/genson/
次の依存関係を追加して問題を解決します
"javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: A message body writer for Java class com.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
at com.Sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.Java:285)"
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.18</version>
</dependency>
まず、_@POST
_ Webサービスが応答を返す場合、_@Produces
_アノテーションを追加する必要があります。
_jersey-json
_ libがクラスパスにあることを確認してください。 toString()
メソッドを削除してみてください。Bean構造形式が壊れる可能性があるためです。
Jacksonに縛られていない場合は、Gensonライブラリを試すことができます http://owlike.github.io/genson/ 。クラスパスに必要なのはlibだけで、追加コードなしですべてが機能するはずです。 web.xmlでPOJOMappingFeatureを使用したり、pojoに@XMLRootElementを追加したりする必要さえありません!
Jerseyメカニズム(ContextResolver)を使用して、特定の構成でGensonのインスタンスを注入することもできます。
'com.Sun.jersey:jersey-bundle:1.19'
そしてそれは解決しませんでした。
genson
への依存関係の設定は解決しました。
runtime(
'com.owlike:genson:0.99'
)
私はこれに文字通り4日間を費やし、グーグルで何時間も何時間もグーグルした後、なぜPOSTがまったく機能しなかったのか。ジャクソンの代わりにMOXYを使用することを提案するstackoverflowの人々によるclassdefnotfoundエラーとして、私もgensonライブラリを試してみましたが、まったく違いはありませんでした。
私は完全にMOXYを削除し、ジャクソンだけを残しました。数時間後、私は最終的に解決策を見つけました。それは、それがどれほど簡単だったのか、私を少し怒らせました。ワークスペースは、web.xmlを保持するwebapplication用とRESTful API用の複数の異なるプロジェクトに分かれています。
また、私はジャージー2を実行していますが、これは別の問題であり、この問題に対する多くの受け入れられた回答はジャージー1についてのみ語っていたため、最初にこれを解決しようとしたときに非常に混乱しました。
何時間も試してみて、最終的にはこれに至りました(OPに投稿されたコードの構造を使用):
Stackoverflowの多くの例では@OmlRootElementを省略しているようですが、POJOクラスの先頭に@XmlRootElementを含める必要があります。
Web.xmlを含むプロジェクトと、RESTサービスおよび関連クラスを含むプロジェクトの両方に、以下を含める必要があります。ジャージーのバージョンに関連するバージョンを変更します。使っている。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.5.1</version>
</dependency>
それでおしまい。これと、使用している関連するジャージーライブラリ以外のものを含める必要はありません。
これが他の誰かがこれをトラブルシューティングする時間を節約するのに役立つことを真剣に願っています。
私は同じ問題を抱えていたので、すべてのjson依存関係を削除し、com.owlike genson 0.99を追加して修正しました
これは古い質問であることは知っていますが、この問題に遭遇し、上記のすべての解決策を試しましたが、残念ながら、それらのどれも私を助けませんでした。私が見つけたのは、MediaTypeクラスが2つの異なるjarで定義されており、jarを作成するときに、他のクラス(私の場合、glassfish jar)で定義されたクラスが使用されたことです。他のjarを削除した後(特定の部分を除外することもできます)、問題は解決しました
Jersey-bundle-1.19.1.jar(非Maven)を使用する場合、これを削除する必要がありました。
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
web.xmlファイルから。
私は、このセクションが必要であることをドキュメントが示唆していることを知っていますが、驚くべきことにそれが問題の理由でした。
Mavenの新しいバージョンについて、依存関係の問題がある場合、ここに公式の参考資料があります。 https://jersey.Java.net/documentation/latest/modules-and-dependencies.html#d0e38 (セクション2.3.1、2.3.2)
また、EclipseにJerseyのmavenおよびtutoをインストールするための優れたチュートリアルもあります。 http://javaposts.wordpress.com/2012/01/14/maven-rest-jersey-Eclipse-tutorial/
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- if you are using Jersey client specific features -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
次のjarライブラリをダウンロードしようとしました。
gson 0.99をダウンロードすると、残りのサービスがうまく機能します。
この依存関係を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>
また、postメソッドの実際の型パラメーターを確認してください。
依存関係としてもgsonがあるため、JsonObject(gson)の代わりにJSONObject(Jersey-JsonのJettison)を使用する必要があり、同じ例外が発生しました。