28

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

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

解決策を探しているときにこのチュートリアルを見つけました: http://aruld.info/handling-generified-collections-in-jersey-jax-rs/しかし、リストされている例はどれも機能していないようです。

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

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

これが私のすべての瓶です:

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)
4

8 に答える 8

37

Region クラスに @XmlRootElement でアノテーションを付ける必要があります。

于 2012-06-14T20:51:09.920 に答える
10

私が見る簡単な解決策として:

final List<MyModel> myList = new ArrayList<>();
Response.ok().entity(new GenericEntity<List<MyModel>>(myList) {}).build();
于 2014-06-11T13:58:29.540 に答える
8

他の答えは私にはうまくいきませんでした (私はすでに 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

于 2013-03-27T15:30:21.420 に答える
1

リストを期待しているように、Bean クラスに @XmlRootElement で注釈を付けることができます。しかし、同じことは Map には当てはまりません。Jersey は内部的に moxy を使用してジョブを実行します。

于 2016-02-11T01:14:29.023 に答える
-2
    You can use JSONObject to create a Json Response 

    eg: 

    List<Region> regions = regionDao.getAll();
    JSONArray list = new JSONArray();
    for(Region region : regions )
    {
       JSONObject jObject= new JSONObject();
       //put all the data in json object
       jObject.put(region.getSomething());
       // and put this Jsonobject in JsonArray
       list.add(jObject);
    }

Or 

Response.ok().entity(new GenericEntity<List<Region>>(regions) {}).build();

PS:うまくいかない場合は、回答に反対票を投じないでください。

于 2014-03-19T09:08:24.673 に答える