NullPointerException при использовании @JsonCreator и @JsonProperty

0

У меня есть проект 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)

Что мне здесь не хватает? Нужно ли добавлять дополнительные аннотации?

  • 0
    Ufff! 1.8 старый (но я уверен, что вы уже это знаете). Я пытался взглянуть на строчку, что в grepcode не grepcode , надеюсь, это подсказка (глядя на ваш код, не знаю ...) Можете ли вы предоставить версию, которую вы используете для jar org.codehaus.jackson ? Глядя на jersey-json 1.8 pom, он указывает на 1.1, но в JaxbAnnotationIntrospector для этой версии нет строки 860 .... Конечно, это моя ошибка. Не могли бы вы опубликовать версию, которую вы используете?
  • 0
    Извините, я был в отпуске в то время ... мы используем версию 1.7.1 Джексона
Показать ещё 4 комментария
Теги:
jackson
jersey

1 ответ

0
Лучший ответ

Мы перешли на майку версии 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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню