【问题标题】:Jersey Json and Pojo泽西 Json 和 Pojo
【发布时间】:2013-11-26 20:33:30
【问题描述】:

我花了太多时间(我会说超过 10 个)试图弄清楚如何获取基本的 json 调用(来自 angularjs)以在我的 Jersey 2.4 上打开和处理。 我已经在谷歌上尝试了所有可能的结果,但仍然得到一个

415(不支持的媒体类型)

客户端和一个

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=class jersey.webreadability.controllers.jsonmodels.TextInput, genericType=class jersey.webreadability.controllers.jsonmodels。文本输入。

在服务器端。

我将在这里写下我在尝试解决此问题时更改的所有可能文件,希望它可以帮助某人帮助我。 目前我真的不在乎它会如何工作,只要它可以工作,我确实理解我应该与杰克逊或 Gson 一起工作的人。

依赖项(来自 POM 文件):

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json</artifactId>
    <version>2.0-m05-1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.17.1</version>
</dependency>

来自 Web.xml:

<servlet>
    <servlet-name>webReadability</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>jersey.webreadability.controllers</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.algo.server.webservice;org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

对象类:

@XmlRootElement(name = "TextInput")
public class TextInput implements Serializable {

@XmlElement public String url;
@XmlElement public String text;
@XmlElement public String file;

public TextInput() {
}

public TextInput(String url, String text, String file) {
    this.url = url;
    this.text = text;
    this.file = file;
}

@Override
public String toString() {
    return "TextInput{" + "url=" + url + ", text=" + text + ", file=" + file +
            '}';
}
}

主类:

@Path("/analysisController")
public class AnalysisController {

@POST
@Path("/sayHello")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public String sayHello(final TextInput text) {
    System.out.println("printing out the sent text: " + text);

    return "hello " + text.file;
}
}

和js:

var mockDataForThisTest = "json=" + encodeURI(JSON.stringify([
        {
            url: "http://www.example.com",
            text: "txext text tex",
            file: $scope.textarea
        }
    ]));

    var httpRequest = $http({
        method: 'POST',
        url: '/rest/analysisController/sayHello/',
        data: mockDataForThisTest,
        headers: {
            'Content-Type': 'application/json'
        }
    }).success(function(data, status) {
        $scope.textarea = data;
        console.log(data);
    }).error(function(error) {
        console.log('error!');
    });

这就是我目前所拥有的一切,希望对您有所帮助。

非常感谢。

【问题讨论】:

  • 如果 Content-Type 设置不正确,您可能会收到此错误。你能检查一下吗?

标签: java json rest maven jersey


【解决方案1】:

我将此添加为我自己的答案,因为我认为这将帮助任何人在未来拥有糟糕的泽西岛工作副本。同时,@Michal Gajdos 的回答非常有帮助,以后遇到问题时也应该联系他的文字。

最终帮助我的是一个依赖,它包含了你需要的几乎所有东西。只需添加它并尝试一下

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.2.3</version>
</dependency>

来源:Git

【讨论】:

  • 能否请您告诉我这个jackson-jaxrs-json-prodiver jar 旁边所有需要的依赖项,因为我要花一天时间。
  • 对不起,我不需要任何其他依赖项
【解决方案2】:

依赖关系

删除 jersey-media-json(此模块在 Jersey 2.x 中不再存在)和 jersey-json(仅适用于 Jersey 1.x)并添加模块之一 jersey-media-moxy (JAXB) 或jersey-media-json-jackson (POJO)。有关这些模块的更多信息,请参阅 Jersey 用户指南中的 JSON chapter

web.xml

删除 com.sun.jersey.config.property.packagescom.sun.jersey.api.json.POJOMappingFeature,它们是 Jersey 1.x 特有的,在 Jersey 2.x 中没有用。第一个已被 jersey.config.server.provider.packages 替换,第二个已被删除(使用 POJO JSON对象映射使用 Jackson 模块 jersey-media-json-jackson)。

注册功能

如果您使用 jersey-media-json-jackson 模块,您需要在 JAX-RS 应用程序的扩展或 web.xml 中注册 JacksonFeature(使用来自 ServerProperties 的属性) - 请参阅 Jackson chapter。 MOXy (jersey-media-moxy) 在模块位于类路径时自动注册。

【讨论】:

  • 完成并做了一些更小的更改(字符串测试适用于 GET 和 POST),但是当我尝试将我的类用作参数或输出(return Response.ok(text).build();)时,我得到了一个@987654337 @ 或 MessageBodyWriter 取决于我是发送还是接收
【解决方案3】:

在 web.xml 中启用 JacksonFeature。另见ServerProperties

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.your.packages</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-10
    • 2011-10-14
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多