【发布时间】:2015-12-29 07:51:10
【问题描述】:
我有一个 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;
}
即使我们决定使用带有空构造函数和公共设置器的私有成员,它仍然可以正常工作。
但是我们希望类是不可变的。经过一些研究,我发现我可以通过使用@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.8 是一个旧版本(但我相信你已经知道了)。我试图看看它在
grepcode失败的那一行,希望它能给出一个提示(通过查看你的代码,不知道......)你能提供你用于jar org.codehaus 的版本吗.杰克逊?通过查看 jersey-json 1.8 pom,它指向 1.1,但该版本在JaxbAnnotationIntrospector处没有第 860 行......当然这是我的错误。能否请您发布您正在使用的版本? -
对不起,我正在度假……我们使用的是 jackson 的 1.7.1 版
-
希望您假期愉快!好的,我在
grepcode中找不到 1.7.1,最接近的是 1.7.0,实际上在那个版本中,你的空指针更有意义,第 860 行可能有一个空值。不过,没有太多意义。你确定你的依赖是一致的吗?也许你可以发布你的 pom.xml?这是一个疯狂的猜测,但我会说你的杰克逊版本对于你的球衣版本来说太新了。希望对您有所帮助。 -
好的,我会检查一下……但是公司架构师今天会给我们一些时间来测试 1.19 版的球衣。也许问题会消失
-
那我肯定会先检查 1.19,然后再深入研究问题......祝你好运。
标签: java json angularjs jersey jackson