用jackson反序列化JAXBElement

时间:2016-06-27 12:14:28

标签: java json serialization jaxb jackson

我有这样的模特:

... DATE_FORMAT(creation, \'....\')....

和json的一部分:

public class Type {

    @XmlElementRef(name = "ConversationId", namespace = "...", type = JAXBElement.class, required = false)
    protected JAXBElement<String> conversationId;
}

我尝试使用此映射器进行反序列化:

  "conversationId": {
    "declaredType": "java.lang.String",
    "globalScope": false,
    ...,
    "value": "ABC000000001"
  },

但无论如何,我的计划并不顺利,我得到了:

  

com.fasterxml.jackson.databind.JsonMappingException:找不到类型[simple type,class javax.xml.bind.JAXBElement]的合适构造函数:无法从JSON对象实例化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息?)

我想阅读一些关于mixins的文档,但是关于官方杰克逊的网站有过时的信息,我使用的是2.5.1版本

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,终于能够解决。为了使它起作用,需要发生两件事:

  1. Mixin类必须位于单独的文件中,而不是内部文件或 匿名类。
  2. mixin类必须位于不同的包中, 即如果创建映射器的代码在包中 com.foo.bar,然后Mixin类一定不在此包中。

这是我的代码:

package com.foo.bar;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

@JsonIgnoreProperties(value = {"globalScope", "typeSubstituted", "nil", "scope"})
public abstract class JAXBElementMixIn<T> extends JAXBElement<T> {
    @JsonCreator
    public JAXBElementMixIn(@JsonProperty("name") QName name,
                            @JsonProperty("declaredType") Class<T> declaredType,
                            @JsonProperty("value") T value) {
        super(name, declaredType, value);
    }
}

以及使用它的代码:

package x.y.z;

...

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(JAXBElement.class, JAXBElementMixIn.class);