1

私のjax-rsアプリケーションの方法:

@GET
@Produces (MediaType.APPLICATION_JSON)
public List <Document> getDocumentList(@HeaderParam("Range") String headerRange) {
int [] range = getRangeFromHeader(headerRange);
return facade.listByRange(range);
}

正常に動作しています。ただし、次の変更を行う場合:

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getDocumentList(@HeaderParam("Range") String headerRange) {
   int[] range = getRangeFromHeader(headerRange);
   return Response.ok(
          facade.listByRange(range))
         .header("Content-Range", getContentRangeStr(range)).build();
}

エラーが表示される

...NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response
object of type: java.util.ArrayList of media type: application/json...

サーバー Jboss 7.1.1

何が悪いのか教えてください。

PS.下手な英語でごめんなさい。

4

2 に答える 2

1

以下のスニペットでうまくいくはずです。

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getDocumentList(@HeaderParam("Range") String headerRange) {
   int[] range = getRangeFromHeader(headerRange);
   return Response.ok(
        new GenericEntity<List<Document>>( (List<Document>)facade.listByRange(range))
         )
         .header("Content-Range", getContentRangeStr(range)).build();
}

匿名GenericEntityサブクラスは、ライターに正しい型情報を提供するために必要です (それ以外の場合はコンパイラによって消去されます)。

--編集

org.jboss.resteasy.resteasy-jackson-providerあなたのコードが使用して動作しなかった理由org.jboss.resteasy.resteasy-jettison-providerは、2 つのプロバイダーの根本的な違いにあります。

  • 前者 (jackson) は JavaBean モデルに依存し、シリアライズするオブジェクトのプロパティを検出し、型情報を必要としません。
  • 後者 (jettyson) は JAXB アノテーションに依存しているため、コンパイラーによって消去された、基礎となる型情報が必要です。
于 2013-09-04T14:36:57.017 に答える
0

ここで説明されているように、ライブラリがありません:

ここに解決策があります

これは、クラスパスに JSON ライブラリがないことを意味します。Jackson は私が使用しているものなので、これを pom.xml に追加すると役立ちます。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.10.1</version>
</dependency>
于 2015-04-28T17:48:10.343 に答える