Jersey 2.x 使用 Pojo 作为 POST 的参数

Posted

技术标签:

【中文标题】Jersey 2.x 使用 Pojo 作为 POST 的参数【英文标题】:Jersey 2.x using Pojo as Parameter for POST 【发布时间】:2015-01-03 15:57:30 【问题描述】:

我在尝试使用 POJOS 作为参数时遇到了 NPE 的一些问题。 我正在使用默认配置将 war maven 生成部署到 tomcat 7。

我的方法的签名是这样的。

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/do/")
public OtherPojo doSomething(MyPOJO pojo) 

Pojo 使用 @XmlRootElement 注释 但是,当我调用 url 时,pojo 为空,因此我得到了 NPE。 我的 pom.xml

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-metainf-services</artifactId>
  <version>$jersey.version</version>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.containers</groupId>
  <artifactId>jersey-container-servlet</artifactId>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>$jackson.version</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>$jackson.version</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>$jackson.version</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>$jackson.version</version>
</dependency>

我试过球衣 2.13 和 2.6 还有杰克逊 2.4

另外我没有设置应用程序,我的类只有注释

@Path("/somePath/")
public class SomeClass 

这是在我的 web.xml 中配置的

    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.beer.routes</param-value>
    </init-param>

我读到我可能需要注册 JacksonFeature,但我不知道该怎么做。

【问题讨论】:

【参考方案1】:

经过进一步审查,上面的代码运行良好。 问题是在调用类时,我正在发送带有小写名称的有效负载。 POJO 看起来像

private String someString;

public void getSomeString()  ... 
public String setSomeString (String s) ...

我的有效负载中的问题是我发送“someString”而不是“SomeString”。 这非常相关,因为它是我的对象被接收为 null 的原因。

更改有效负载后,错误变为此。 Jackson with JSON: Unrecognized field, not marked as ignorable

【讨论】:

以上是关于Jersey 2.x 使用 Pojo 作为 POST 的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在不手动转换为 JSON 的情况下使用 Jersey 客户端发布 Pojo?

Jersey 2.x 前言和约定的文本格式

将使用 jersey 1.x 的 java 代码转换为 jersey 2.x

在 Jackson/Jersey JAVA 上发布带有多个参数 JSON 和 String 的请求

如何在 Jersey 2.x 中返回对象

Jersey 2.x 从Maven Archetype 创建一个新项目