17

単純な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();
    }

私が何か間違ったことをしているなら、私に提案してください。

4

15 に答える 15

15

この問題はjersey-bundle-1.8.jarで修正されています

于 2012-09-03T06:30:29.520 に答える
9

私のpom.xmlに以下を追加することで問題を修正しました:

    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>0.99</version>
    </dependency>

ドキュメントは次の場所にあります:https ://code.google.com/p/genson/

于 2014-09-09T22:18:34.493 に答える
4

まず、@POSTWebサービスが応答を返す場合は、@Producesアノテーションを追加する必要があります。

jersey-jsonlibがクラスパスにあることを確認してください。toString()Beanの構造形式が壊れている可能性があるため、メソッドを削除してみてください。

于 2012-08-30T11:40:50.463 に答える
4

問題を解決するには、次の依存関係を追加します

"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>
于 2014-04-21T07:18:14.600 に答える
3

ジャクソンに縛られていない場合は、Gensonライブラリhttp://owlike.github.io/genson/を試すことができます。クラスパスに必要なのはlibだけで、追加のコードがなくてもすべてが機能するはずです。web.xmlでPOJOMappingFeatureを使用したり、pojoに@XMLRootElementを追加したりする必要はありません。

ジャージメカニズム(ContextResolver)を使用して、特定の構成でGensonのインスタンスを注入することもできます。

于 2012-08-29T16:30:24.653 に答える
3

試してみまし'com.sun.jersey:jersey-bundle:1.19'たが、解決しませんでした。

依存関係をgenson解決済みに設定します。

runtime(
        'com.owlike:genson:0.99'
)
于 2015-03-08T07:33:10.090 に答える
3

私はこれに文字通り4日間を費やし、何時間もグーグルした後、POSTがまったく機能しなかった理由を説明しました。スタックオーバーフローの人々がジャクソンの代わりにMOXYを使用することを提案したため、このエラーと、classdefnotfoundエラーなどのMOXYに関連する他のエラーが発生していました。また、まったく違いがないgensonライブラリも試してみました。

結局、MOXYを完全に削除し、Jacksonだけを残しました。数時間後、私はついに解決策を見つけました。それはそれがいかに単純であったかによって少し腹を立てました。私のワークスペースは複数の異なるプロジェクトに分かれています。1つはweb.xmlを保持するWebアプリケーション用で、もう1つはRESTfulAPI用です。

私はJersey2も実行しています。これは、この問題に対して受け入れられた回答の多くがJersey 1についてのみ話していたため、別の問題でした。これを最初に解決しようとしたときは、非常に混乱していました。

何時間も試した後、(OPに投稿されたコードの構造を使用して)これに行き着きました:

  1. 省略しているように見えるstackoverflowの例の多くとは異なり、POJOクラスの先頭に@XmlRootElementを含める必要があります。

  2. web.xmlを含むプロジェクトと、RESTサービスおよび関連するクラスを含むプロジェクトの両方に、以下を含める必要があります。使用しているジャージーのバージョンに関連するバージョンを変更してください。

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

それでおしまい。これと、使用している関連するジャージーライブラリ以外のものを含める必要はありません。

これが他の誰かがこれをトラブルシューティングしようとする時間を節約するのに役立つことを真剣に願っています。

于 2016-12-21T02:09:47.547 に答える
2

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ファイルから。

ドキュメントがこのセクションが必要であることを示唆していることを私は知っていますが、驚くべきことにそれが問題の原因でした。

于 2017-01-18T08:53:29.640 に答える
1

同じ問題が発生し、すべてのjson依存関係を削除し、com.owlikegenson0.99を追加して修正しました

于 2014-05-26T18:26:12.200 に答える
1

これは古い質問ですが、この問題に遭遇し、上記のすべての解決策を試しましたが、残念ながら、どれも役に立ちませんでした。私が見つけたのは、MediaTypeクラスが2つの異なるjarで定義されており、jarをビルドするときに、他のクラス(私の場合はglassfish jar)で定義されたクラスを使用したことです。他のjarファイルを削除した後(特定の部分を除外することもできます)、問題は解決しました

于 2016-03-27T08:29:42.833 に答える
1

次のjarライブラリをダウンロードしようとしました。

gson 0.99をダウンロードすると、RESTサービスがうまく機能します。

于 2018-03-28T21:56:45.543 に答える
0

新しいバージョンのMavenについて、依存関係の問題がある場合は、https: //jersey.java.net/documentation/latest/modules-and-dependencies.html#d0e383(セクション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>
于 2013-07-09T22:21:50.457 に答える
0

postメソッドの実際のタイプパラメータも確認してください。

依存関係としてgsonもあるので、JsonObject(gson)の代わりにJSONObject(Jersey-JsonのJettison)を使用する必要があります。これにより、同じ例外が発生しました。

于 2014-05-08T09:54:28.677 に答える
0

この依存関係を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>
于 2014-06-11T11:49:27.340 に答える
0

私も1.19.4ジャージで同じ問題を抱えています。追加することで修正されました

compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.10.0.pr1'

依存関係をGradleします。

ありがとう、PraveenR。

于 2019-11-20T10:49:46.007 に答える