24

私の問題が何であるかを理解しようとした後、私は最終的に私の問題を解決する方法をあなたに尋ねることに決めました。私は同じ問題を抱えているさまざまな人々を見てきました。彼らに勧められたすべてのことを試しましたが、私の問題には何の助けもありませんでした。つまり、基本的には、Jerseyを使用して構築したRESTfulサービスを使用しています。クライアントの場合、JSON形式でオブジェクトを返したいと思います。さまざまなチュートリアルを読み、je​​rsey-json-1.8ライブラリを使用するのが理にかなっていると判断しました。いつものようにプロジェクトにすべてを追加して実行しようとしましたが、サービスを呼び出すたびに(get request atmを介して)HTTPエラーコード500(内部サーバーエラー)が発生し、サーバーはメッセージ本文がないと応答しますライターが見つかりました。XMLを返す場合、それは問題なく機能し、すべてが素晴らしいです。jersey-json-1.8もコピーしてみました。jarをTomcatlibフォルダーに移動します。これは、使用しているmysql libでこれを実行する必要があったためですが、どちらも役に立ちませんでした。このようなものを機能させるために私を助けてくれたら本当に嬉しいです!さらに情報が必要な場合は、コメントを残してください。できるだけ早く人間的に提供します:)

プロジェクトのセットアップは次のとおりです。3つの異なるパッケージ1.RESTfulServices2.SQL接続などを処理するJavaWork3.作業する必要があり、JSON形式で返したいすべてのモデルを格納するパッケージ(私の例では、テストドライブのルート)

Tomcat WebサーバーIDE:Eclipse私はMavenを使用しています

オブジェクトを返そうとしているものや方法に関係なく、オブジェクトは機能せず、常にエラーメッセージが表示されます。

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;


    }
}
4

9 に答える 9

48

Gensonライブラリをクラスパスhttp://owlike.github.io/genson/に追加してみてください。これは、json<>javaストリーミングおよびデータバインディングAPIです。ジャージとうまく統合できるので、ランニングをするには0の構成が必要です。Jerseyは、ライブラリがクラスパスにあることを検出し、Gensonに委任することでjsonマッピングを有効にします。

于 2012-11-18T11:52:21.033 に答える
15

この依存関係を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-11T12:20:46.990 に答える
11

以下の依存関係を追加すると、問題が解決しました。@eugenに従ってGenson、例外を取り除くのに役立つ依存関係を追加しようとしましたが、サーバーが何らかの理由で400の不正な要求をスローしていました。Gensonjsonリクエストを適切にストリーミングできなかったようです。しかし、以下の依存関係はうまく機能しました。この問題が私を狂わせていたので、それが他の人に役立つことを願っています!

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.3.0</version>
</dependency>
于 2014-03-06T21:58:16.227 に答える
3

jersey-json依存関係をpom.xmlの先頭に移動すると、この問題が解決しました。

<dependencies>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
  </dependency>

  <!-- other dependencies -->

</dependencies>
于 2014-09-08T09:00:20.000 に答える
2

パッケージエクスプローラーのMavenの依存関係を確認します。それまたはjersey-bundle-1.8.jarが表示されない場合は、おそらくjersey-serverのみを指定しています。pom.xmlの依存関係をjersey-bundleに変更すると、機能するはずです。

于 2013-01-13T01:39:31.317 に答える
1

ジャージー2.4:私もこの問題に直面し、誰かに役立つ場合に備えてこれを投稿しました。これは、JSON統合用のJersey API仕様から取得しました:(https://jersey.java.net/documentation/latest/user-guide.html#json

Jettisonを使用して、JSONを使用してJerseyと統合しました。しかし、すべてのライブラリを追加した後でも、エラーが発生しました。JavaクラスおよびMIMEメディアタイプapplication/jsonのメッセージ本文ライターが見つかりませんでした。

適切なライブラリの追加と機能の登録に関するすべて>Jerseyが提供する他のすべてのライブラリに加えて1つのライブラリを追加しました:jersey-media-json-jettison-2.4.jar。そして、JettisonFeatureを登録するために以下のコードを追加しました。

   public class MyApplication extends ResourceConfig{
      public MyApplication() {
          register(JettisonFeature.class);
          packages("org.XXX.XXX.XXX");   
    }
于 2013-11-14T16:12:15.283 に答える
1

この質問は少し前に尋ねられましたが、読んでいる人のために、サーブレットサーブレットコンテナには独自の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を適切にシリアル化しませんが、jerseyはシリアル化します。

于 2014-08-30T05:58:00.850 に答える
0

@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()));
    }
}
于 2013-08-06T11:47:57.503 に答える
0

上記の問題は、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ライブラリ。

注:Jacksonは、クラスがSerializable Interfaceを実装している場合にのみ、応答をjsonに変換します。したがって、JSONObjectを送信する場合は、JSONObjectのリストを送信することをお勧めします。

于 2018-07-21T08:23:37.867 に答える