24

在试图弄清楚我的问题是什么之后,我终于决定问你如何解决我的问题。我见过不同的人有同样的问题,我尝试了他们被建议做的所有事情,但对我的问题没有任何帮助。所以基本上我有一个使用 Jersey 构建的 RESTful 服务。对于我的客户,我想以 JSON 格式返回一个对象。我阅读了不同的教程并决定使用 jersey-json-1.8 库是有意义的。我像往常一样将所有内容添加到我的项目中并尝试运行它,但每次我调用服务时(通过 get request atm。)我收到 HTTP 错误代码 500(内部服务器错误)并且我的服务器响应没有消息正文作家可以找到。如果我返回 XML,它工作得很好,一切都很好。我还尝试复制 jersey-json-1.8。jar 到我的 Tomcat lib 文件夹,因为我必须使用我正在使用的 mysql lib 执行此操作,但它也没有帮助。如果你能帮我把这些东西弄好,我会很高兴的!如果您需要更多信息,请发表评论,我会尽快提供:)

我的项目设置是: 3 个不同的包 1. 我的 RESTfulServices 2. 我的 Java 工作,我处理 SQL 连接等。 3. 一个包,我存储我需要使用的所有模型并且我想以 JSON 格式返回(在我的示例中为试驾路线)

Tomcat Webserver 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 个错误请求。似乎Genson无法正确传输 json 请求。但下面的依赖工作正常。希望它对其他人有所帮助,因为这个问题让我发疯了!

<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

Check under Maven Dependencies in the Package Explorer, if you don't see that or jersey-bundle-1.8.jar, then you probably have specified just jersey-server. Change the dependency in pom.xml to jersey-bundle and it should work.

于 2013-01-13T01:39:31.317 回答
1

这个问题是不久前提出的,但对于那些阅读,请注意 jersey servlet 容器有它自己的 POJO 映射器。

通过将以下内容添加到您的 web.xml 来启用它

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

我确实注意到 jersey 和 genson 映射对象的方式存在一些差异。例如,如果一个类有一个类型为 A 的字段,该字段设置为 B 的一个实例,它扩展了 A,genson 将不会正确序列化 B,而 jersey 会。

于 2014-08-30T05:58:00.850 回答
1

Jersey 2.4:我也遇到了这个问题,并发布这个以防它帮助某人。我从 Jersey API Specification for JSON Integration 中选择了这个:(https://jersey.java.net/documentation/latest/user-guide.html#json

我使用 Jettison 将 Jersey 与 JSON 集成。但即使在添加了所有库之后,我也得到了错误:找不到 Java 类和 MIME 媒体类型应用程序/json 的消息正文编写器

这一切都是为了添加正确的库并注册功能> 除了 Jersey 提供的所有其他库之外,我还添加了一个额外的库:jersey-media-json-jettison-2.4.jar。并添加了以下代码来注册 Jettison 功能。

   public class MyApplication extends ResourceConfig{
      public MyApplication() {
          register(JettisonFeature.class);
          packages("org.XXX.XXX.XXX");   
    }
于 2013-11-14T16:12:15.283 回答
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

上述问题将通过使用jackson库而不是genson来解决。

    <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 才会将您的响应转换为 json。因此,如果您要发送 JSONObject,那么最好发送 JSONObject 列表。

于 2018-07-21T08:23:37.867 回答