java - JAXB2Marshaller 没有将 xml 元素解码为字符

标签 java spring jaxb unmarshalling

我在使用 JAXB2Marshaller 将 xml 元素解码为字符时遇到问题。

我的 XML 输入包含一个元素 <dateCheckFlag>Y</dateCheckFlag> : 当我尝试获取 dateCheckFlag元素值转化为Character输入我的 pojo,它给了我 null。

假设所有的 setter getter 和构造函数都存在。

谁能帮我解决如何将 xml 元素解码为字符...?

@XmlRootElement(name="Emp")
class Emp
{
    @XmlElement(name="name");
        String name;
    @XmlElement(name="dateCheckFlag");
        Character dateCheckFlag;
Emp(){}

Emp(String name, Character dateCheckFlag)
{ 
 this.name= name;
 this.dateCheckFlag = dateCheckFlag;
}

public void setName(String name)
{
 this.name=name;
}
public String getName()
{
 return name;
}

public void setDateCheckFlag(Character flag)
{
 this.dateCheckFlag=flag;
}
public Character getName()
{
 return dateCheckFlag;
}

最佳答案

JAXB (JSR-222)规范未定义 char/Character 的 XML 表示。 默认情况下,JAXB 引用实现将 Character 转换为 xs:unsignedShort 类型。这意味着它需要一个像这样的文档:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Emp>
    <name>Jane Doe</name>
    <dateCheckFlag>89</dateCheckFlag>
</Emp>

XmlAdapter

您将能够使用 XmlAdapter 来获取您正在寻找的 XML。 XmlAdapter 允许您将一个对象转换为另一个对象以更改 XML 表示形式。

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class CharacterAdapter extends XmlAdapter<String, Character> {

    @Override
    public Character unmarshal(String string) throws Exception {
        return string.charAt(0);
    }

    @Override
    public String marshal(Character character) throws Exception {
        return new String(new char[] {character});
    }

}

Emp

@XmlJavaTypeAdapter 注释用于指定XmlAdapter

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name = "Emp")
@XmlAccessorType(XmlAccessType.FIELD)
class Emp {

    String name;

    @XmlJavaTypeAdapter(CharacterAdapter.class)
    Character dateCheckFlag;

}

演示

下面是一些将 XML 与对象模型相互转换的代码。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Emp.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum15240702/input.xml");
        Emp emp = (Emp) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(emp, System.out);
    }

}

input.xml/输出

<?xml version="1.0" encoding="UTF-8"?>
<Emp>
    <name>Jane Doe</name>
    <dateCheckFlag>Y</dateCheckFlag>
</Emp>

关于java - JAXB2Marshaller 没有将 xml 元素解码为字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15240702/

相关文章:

java - MockMVC jUnit Spring 测试

Spring Batch从数据库读取一次,写入另一个数据库并写入CSV

java - 商标 (™) 符号显示为 ?在使用 JAXB 编码过程中?

java - JAXBElement<Boolean> 与 boolean 值

java - 如何将具有内联模式的 XML 字符串处理为 Java 对象?

java - Mac OS X Activator New Play Framework 错误

java - JLabel 未出现

java - Spring Reactive Router Path - 带排除的通配符

java - 为什么在 Java 中使用泛型?它与重载有何不同?

java - 通过 <s :url/> Struts2 tag 传递多个参数