28

访问我的 jax-rs 资源时,我收到了以下堆栈跟踪。

我正在使用 Tomcat 7、Jersey 1.12 和 Hibernate 4 和 MySQL。

我在寻找解决方案时找到了本教程: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

您需要使用 @XmlRootElement 注释 Region 类。

于 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 一起工作。它返回 XML 很好,而不是 JSON。

我正在使用 jersey-bundle-1.17.jar (也尝试将 asm-3.1.jar 和 jersey-json-1.17.jar 添加到类路径中,但仍然无法正常工作)。我终于尝试下载包含 12 个不同 jar 的 zip。一旦我将所有 12 个 jars 添加到我的类路径中,我终于摆脱了错误并且返回 JSON 效果很好。

我希望这对某人有所帮助。

编辑:这是包含 12 个 jar 文件的 zip 文件的链接:jersey-archive-1.17.zip

于 2013-03-27T15:30:21.420 回答
2

@XmlRootElement 使用此注释可以在 Jersey 中选择 JSON 或 XML。非常感谢!

只需添加以下内容:@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})

如果您在 xml 或 json 中赢得了回报,则根据您在标题中设置的请求!

于 2013-04-26T13:39:18.900 回答
1

添加依赖

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>${jersey-version}</version>
</dependency>
于 2018-02-20T20:48:00.310 回答
1

正如您所期望的那样,您可以使用 @XmlRootElement 注释您的 bean 类。但同样不适用于 Map。Jersey 内部使用 moxy 来完成工作。

于 2016-02-11T01:14:29.023 回答
-2

@@XmlRootElement在您的班级地区之前添加

于 2014-07-21T12:59:26.483 回答
-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 回答