web-dev-qa-db-ja.com

Java class Java.util.ArrayListのメッセージ本文ライター

Jax-rsリソースにアクセスすると、以下のスタックトレースを受け取りました。

私はTomcat 7、Jersey 1.12、Hibernate 4、MySQLを使用しています。

解決策を探しているときにこのチュートリアルを見つけました: http://aruld.info/handling-generified-collections-in-jersey-jax-rs/ .

ここで何が欠けていますか?

MessageBodyWritersと書いてある答えはありません。これでうまくいくはずです。 (そして、私は解決策があることを知っています、私はちょうどそれを理解することができません。)

すべてのjarファイルを次に示します。

antlr-2.7.7.jar
asm-3.1.jar
commons-collections-3.2.1.jar
dom4j-1.6.1.jar
gson-1.7.1.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.0.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
jackson-core-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.CR2.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
jersey-client-1.12.jar
jersey-core-1.12.jar
jersey-json-1.12.jar
jersey-server-1.12.jar
jersey-servlet-1.12.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
mysql-connector-Java-3.1.12-bin.jar

リソースクラスとメソッドは次のとおりです。

@Path("/region")
public class RegionService {
    // This method is called if TEXT_PLAIN is request
    @GET
    @Produces(MediaType.APPLICATION_JSON)   
    public JResponse<List<Region>> region() {
        RegionDao regionDao = new RegionDao();
        regionDao.openSession();
        List<Region> regions = regionDao.getAll();
        regionDao.closeSession();
        return JResponse.ok(regions).build();
    }
}

そして、ここにスタックトレースがあります:

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 Java.util.ArrayList, and Java type Java.util.List<campher.hibernate.entities.Region>, 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:1451)
    at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1363)
    at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1353)
    at com.Sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.Java:414)
28
n4rzul

@XmlRootElementでRegionクラスに注釈を付ける必要があります。

36
Martin Matula

私が見る迅速な解決策として:

final List<MyModel> myList = new ArrayList<>();
Response.ok().entity(new GenericEntity<List<MyModel>>(myList) {}).build();
9

もう1つの答えは私にはうまくいきませんでした(XmlRootElementアノテーションが既にありました)が、ついにJSONで動作するようになりました。 JSONではなく、XMLを正常に返していました。

私はjersey-bundle-1.17.jarを使用していました(クラスパスに追加されたasm-3.1.jarおよびjersey-json-1.17.jarでも試しましたが、まだ機能しませんでした)。最後に、12の異なるjarを含むZipをダウンロードしようとしました。クラスパスに12個すべてのjarを追加したら、ようやくエラーを取り除き、JSONを返すのに最適です。

これが誰かの助けになることを願っています。

編集:12個のjarファイルを含むZipファイルへのリンクを次に示します。 jersey-archive-1.17.Zip

8
11101101b

このアノテーションが付いた@XmlRootElementでは、JerseyでJSONまたはXMLを選択できます。どうもありがとうございました!

休憩に追加してください:@Produces({MediaType.APPLICATION_JSON、MediaType.APPLICATION_XML})

Xmlまたはjsonでリターンを獲得した場合は、ヘッダーに設定したリクエストで!

2
Dante

Listを期待しているように、@ XmlRootElementを使用してBeanクラスに注釈を付けることができます。ただし、Mapでも同じことはできません。 Jerseyは内部的にmoxyを使用して作業を行います。

1
Anudeep Abraham

依存関係を追加

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>${jersey-version}</version>
</dependency>
0
Vadym Vikulin