当前位置: 首页 > 知识库问答 >
问题:

使用@JsonCreator和@JsonProperty时出现NullPointerException

长孙修远
2023-03-14

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

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

接下来的课一切都很顺利

public class POST_WorkitemInfo {
    public String workitem;
    public String workflow;
    public String taskname;
    public String force;
}

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

但是我们想让这个类是不可变的。经过一些研究,我发现我可以通过使用@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个答案

程俊力
2023-03-14

我们迁移到了jersey版本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>
 类似资料:
  • 问题内容: 在Jackson中,当用注释构造函数时,必须用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 当使用阴影和最小化Jar时,我从阴影插件中得到一个NullpointerException。 在下面的示例中,我定义了两个依赖项;junit和Commons-lang3,在我的代码中,只使用了Commons-lang3-中的一个类。我对阴影留档的理解是未使用的类不会包含在阴影罐子中,所以我希望阴影罐子只包含我的类和StringUtils。 运行 时,我得到以下输出(mvn 干净包的完整输出 -X

  • 我开发了一个Spring Boot应用程序。该应用程序可以部署到测试或prod环境,该应用程序使用REST API发出请求。我使用POJO作为包装器,JsonProperty注释包含要推送到的API的字段ID。 ie 这些值的字段标签在测试endpoint上不同。因此,测试endpoint可能希望属性映射为 我希望能够利用Spring Boot对基于概要文件的属性文件的本机支持。在运行时从外部属性

  • Spring Boot应用程序的任务是每隔这么多分钟更新一次远程集成API。此应用程序可以部署到测试或prod环境中,通过“application.properties”标志通知应用程序应该查看的endpoint。POJO被Jackson序列化并推送到endpoint,JsonProperty注释包含它被推送到的API的字段ID。 ie 这些值的字段标签在测试endpoint上不同。因此,测试en

  • 我使用 我编写了一些以块结尾的jruby代码,在运行所有代码后,出现了NullPointerException。但代码以任何其他语句结尾,不会发生异常。 版本:1.7.19 在ARGV。java vars.get变量返回null,因为在BiVariableM中isReceiverIdentical返回falseap.java 在ISReceiver中,此方法只需将接收器与双变量的接收器usgin'