JAXB更改默认命名转换器

问题描述:

在JAXB的帮助下,我想通过重用一些现有的XML /类而不使用JAXB类型/元素注释来进行一些编组和解组。JAXB更改默认命名转换器

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

我的意思是这些类字段(注:他们开始用小写字母)

class Person { 
    String firstName; 
    String lastName; 
} 

映射到XML(注:他们开始用大写字母):

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

我不认为JDK中的JAXB实现可以做到这一点。如果您使用EclipseLink MOXy等替代实现,这可能是可能的。请参阅:[自定义XML名称转换](http://www.eclipse.org/eclipselink/documentation/2.6/moxy/advanced_concepts002.htm#CHDCCCAF) – Jesper

+0

谢谢,@Jesper。我看到这个注解'XMLNameTransformer'可以完成这项工作,但不想引入新的库依赖关系。 –

替代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(); 

而且simillary为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

+0

谢谢,@Oleg。奇迹般有效。我认为某种xml预处理/转换可能会完成这项工作,但这是更好的解决方案。 –