JAXB更改默认命名转换器

时间:2017-08-08 07:02:17

标签: java xml jaxb

在JAXB的帮助下,我希望通过重用一些没有JAXB类型/元素注释的现有XML /类来进行一些编组和解组。

是否可以更改默认的JAXB命名映射配置以映射所有标记/字段,例如" firstName-> FirstName"没有引入任何注释?

我的意思是这些类字段(注意:它们以小写字母开头)

class Person {
    String firstName;
    String lastName; 
}

映射到该XML(注意:它们以大写字母开头):

<Person>
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
</Person>

1 个答案:

答案 0 :(得分:2)

Jesper建议使用MOXy的替代方法是使用StreamReaderDelegateDelegatingXMLStreamWriter过滤输入和输出xml。

对于解组你可以这样做:

String xml = "<Person><FirstName>John</FirstName><LastName>Doe</LastName></Person>";

XMLStreamReader xsr = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(xml));
xsr = new StreamReaderDelegate(xsr) {
    @Override
    public String getLocalName() {
        String s = super.getLocalName(); 
        return Character.toLowerCase(s.charAt(0)) + s.substring(1); 
    }
};

JAXBContext jc = JAXBContext.newInstance(Person.class);
Unmarshaller u = jc.createUnmarshaller();
Person person = u.unmarshal(xsr, Person.class).getValue();

用于marshling的

StringWriter sw = new StringWriter();
XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(sw);
xsw = new DelegatingXMLStreamWriter(xsw) {
    @Override
    public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
        String s = localName;
        super.writeStartElement(prefix, Character.toUpperCase(s.charAt(0)) + s.substring(1), namespaceURI);
    }
};

Marshaller m = jc.createMarshaller();
JAXBElement<Person> jaxbElement = new JAXBElement<Person>(new QName(Person.class.getSimpleName()), Person.class, person);
m.marshal(jaxbElement, xsw);

DelegatingXMLStreamWriter由于某种原因打包私有,但它是一个简单的类,您只需从here复制源。

此解决方案基于this blog post