使用@JsonCreator 和@JsonProperty 时出现 NullPointerException

NullPointerException when using @JsonCreator and @JsonProperty

我有一个针对 RESTful API 的 Java 项目,我使用 Jackson/jersey 来处理传入的 JSON POST 数据从 AngularJS 启用的 Web 应用程序发送。

我们在 1.8 版本中使用 jersey-json(通过 Maven),因为这是我们公司推荐的版本。

与以下 class

一切正常
public class POST_WorkitemInfo {
    public String workitem;
    public String workflow;
    public String taskname;
    public String force;
}

即使我们决定使用带有空构造函数和 public setter 的私有成员,它仍然可以正常工作。

但后来我们希望 class 不可变。经过一些研究,我发现我可以通过将 @JsonCreator 与 @JsonProperty 一起使用来实现这一点,如下所示:

private final String workitem;
private final String workflow;
private final String taskname;
private final String force;

@JsonCreator
public POST_WorkitemInfo(@JsonProperty("workitem") String workitem, @JsonProperty("workflow") String workflow,
                         @JsonProperty("taskname") String taskname, @JsonProperty("force") String force) {
    this.workitem = workitem;
    this.workflow = workflow;
    this.taskname = taskname;
    this.force = force;
}

但是现在对 API 的调用失败并出现 NullPointerException:

java.lang.NullPointerException
org.codehaus.jackson.xc.JaxbAnnotationIntrospector.findAnnotation(JaxbAnnotationIntrospector.java:860)
org.codehaus.jackson.xc.JaxbAnnotationIntrospector._typeResolverFromXmlElements(JaxbAnnotationIntrospector.java:318)
org.codehaus.jackson.xc.JaxbAnnotationIntrospector.findPropertyTypeResolver(JaxbAnnotationIntrospector.java:296)
org.codehaus.jackson.map.AnnotationIntrospector$Pair.findPropertyTypeResolver(AnnotationIntrospector.java:928)
org.codehaus.jackson.map.deser.BasicDeserializerFactory.findPropertyTypeDeserializer(BasicDeserializerFactory.java:502)
org.codehaus.jackson.map.deser.BasicDeserializerFactory.resolveType(BasicDeserializerFactory.java:692)
org.codehaus.jackson.map.deser.BasicDeserializerFactory.constructCreatorProperty(BasicDeserializerFactory.java:787)
org.codehaus.jackson.map.deser.BeanDeserializerFactory._addDeserializerConstructors(BeanDeserializerFactory.java:590)
org.codehaus.jackson.map.deser.BeanDeserializerFactory.findDeserializerCreators(BeanDeserializerFactory.java:524)
org.codehaus.jackson.map.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:393)
org.codehaus.jackson.map.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:370)
org.codehaus.jackson.map.deser.StdDeserializerProvider._createDeserializer(StdDeserializerProvider.java:359)
org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:281)
org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:261)
org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:119)
org.codehaus.jackson.map.deser.StdDeserializerProvider.findTypedValueDeserializer(StdDeserializerProvider.java:140)
org.codehaus.jackson.map.ObjectMapper._findRootDeserializer(ObjectMapper.java:2197)
org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2112)
org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1004)
org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410)
com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474)
com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

我在这里错过了什么?我需要添加更多注释吗?

我们迁移到了球衣版本 1.19

将依赖项添加到 jersey-servlet 后,一切正常,包括不可变 类 和 @JsonCreator@JsonProperty

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.19</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.19</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.19</version>
</dependency>