java - 如何正确使用 Jackson 的 JaxbAnnotationIntrospector?

标签 java jaxb xml-serialization jackson

我能够使用带有默认映射器配置的@JacksonXmlProperty 注释生成我想要的 XML。但是我的类是由 maven-jaxb2-plugin 生成的,并且已经有 @XmlAttribute 注释。当我尝试使用 JaxbAnnotationIntrospector 时,它将属性序列化为子元素。我做错了什么?

预期输出:<problem xmlns="" id="aaa"><description>test</description></problem> (可通过 testGenerateXmlCorrect 重复)

实际输出:<problem xmlns=""><id>aaa</id><description>test</description></problem> (可重复 testGenerateXmlWrong)

我也可以使用 JAXB 生成预期的 XML,但这个问题是如何使用 JaxbAnnotationIntrospector 对 Jackson 进行生成。

联合测试:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import org.junit.Test;

public class JaxbAttributeTest {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(JaxbAttributeTest.class);

@XmlRootElement(name="problem")
public static class ProblemJaxb {
    @XmlAttribute(name="id")     
    public String id;
    public String description;
}

@Test
public void testGenerateXmlWrong() throws JsonProcessingException {
    ProblemJaxb problem = new ProblemJaxb();
    problem.id = "aaa";
    problem.description = "test";
    XmlMapper xmlMapper = new XmlMapper();
    xmlMapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector(xmlMapper.getTypeFactory()));
    log.debug("ProblemJaxb: {}", xmlMapper.writeValueAsString(problem)); 
}

@JacksonXmlRootElement(localName="problem")
public static class ProblemJackson {
    @JacksonXmlProperty(isAttribute=true)
    public String id;
    public String description;
}

@Test
public void testGenerateXmlCorrect() throws JsonProcessingException {
    ProblemJackson problem = new ProblemJackson();
    problem.id = "aaa";
    problem.description = "test";
    XmlMapper xmlMapper = new XmlMapper();
    log.debug("ProblemJackson: {}", xmlMapper.writeValueAsString(problem));
}

}

类路径包括:

  • com.fasterxml.jackson.core:jackson-core:jar:2.3.2
  • com.fasterxml.jackson.core:jackson-annotations:jar:2.3.2
  • com.fasterxml.jackson.core:jackson-databind:jar:2.3.2
  • com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.3.2
  • com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.3.2
  • org.codehaus.woodstox:stax2-api:jar:3.1.1
  • javax.xml.stream:stax-api:jar:1.0-2
  • com.sun.xml.bind:jaxb-impl:jar:2.2.7
  • com.sun.xml.bind:jaxb-core:jar:2.2.7
  • javax.xml.bind:jaxb-api:jar:2.2.7

顺便说一句,我也尝试用这个配置 XmlMapper:

xmlMapper.getSerializationConfig().with(new JaxbAnnotationIntrospector(xmlMapper.getTypeFactory()));

但这会产生更糟糕的输出,因为根元素名称不正确:<ProblemJaxb xmlns=""><id>aaa</id><description>test</description></ProblemJaxb>

最佳答案

看起来这个问题存在before , 但 jackson 的作者无法复制。错误报告似乎并没有走得太远。

我能够使用 XmlJaxbAnnotationIntrospector 解决问题而不是 JaxbAnnotationIntrospector

关于java - 如何正确使用 Jackson 的 JaxbAnnotationIntrospector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22433679/

相关文章:

Java switch 语句将变量从一种情况调用到另一种情况

java - JMS消息生产者不会将消息发送到队列

java - 值不正确的递归

java - 帮助使用 Jettison 将 JSON Twitter 答案映射到 Jaxb

Android XML 序列化

Java信号量+调用acquire()时不持有同步锁

java - 使用 JAXB 编码/解码字段以标记属性

web-services - 使用 JAXB 和 JAXWS 注释将枚举属性编码到 XML

c# - 如何将属性序列化为具有默认属性的元素

c# - C#解析XML数据并显示到ListBox