У меня есть проект Java для RESTful API, где я использую Jackson/jersey для обработки входящих данных JSON POST, которые отправляются из веб-приложения с поддержкой AngularJS.
Мы используем jersey-json в версии 1.8 (через Maven), потому что это рекомендуемая версия в нашей компании.
Все хорошо работало со следующим классом
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.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>
grepcode
неgrepcode
, надеюсь, это подсказка (глядя на ваш код, не знаю ...) Можете ли вы предоставить версию, которую вы используете для jar org.codehaus.jackson ? Глядя на jersey-json 1.8 pom, он указывает на 1.1, но вJaxbAnnotationIntrospector
для этой версии нет строки 860 .... Конечно, это моя ошибка. Не могли бы вы опубликовать версию, которую вы используете?