JAXB - marshal with java comments

I am new to JAXB and for starters I am compiling some simple Java files such as Hello, world! .

I want to arrange the whole file, even if my comment lines are placed as follows:

 /* * some comment */ //another comment 

And get them in XML in the comments block:

 <!-- some comment --> <!-- another comment --> 

Is there a way to marshal java comment files?

+5
source share
1 answer

There are several obstacles that need to be overcome in your use case:

  • Comments are not stored in byte code for the class, so you will need to make them available elsewhere.
  • The JAXB API does not provide a way to map to node content.

The following is an approach that might work for you: StAX with JAXB and using Marshaller.Listener .

Java Model

Client

 import javax.xml.bind.annotation.*; @XmlRootElement @XmlType(propOrder={"name", "address"}) @XmlAccessorType(XmlAccessType.FIELD) public class Customer { private String name; private Address address; public Customer() { } public Customer(String name, Address address) { this.name = name; this.address = address; } } 

Address

 import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class Address { String street; public Address() { } public Address(String street) { this.street = street; } } 

Demo code

MyMarshalListener

 import javax.xml.bind.Marshaller; import javax.xml.stream.*; public class MyMarshallerListener extends Marshaller.Listener { private XMLStreamWriter xsw; public MyMarshallerListener(XMLStreamWriter xsw) { this.xsw = xsw; } @Override public void beforeMarshal(Object source) { try { xsw.writeComment("Before: " + source.toString()); } catch(XMLStreamException e) { // TODO: handle exception } } @Override public void afterMarshal(Object source) { try { xsw.writeComment("After: " + source.toString()); } catch(XMLStreamException e) { // TODO: handle exception } } } 

Demo

 import javax.xml.bind.*; import javax.xml.stream.*; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Customer.class); Address address = new Address("123 A Street"); Customer customer = new Customer("Jane", address); XMLOutputFactory xof = XMLOutputFactory.newFactory(); XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out); Marshaller marshaller = jc.createMarshaller(); marshaller.setListener(new MyMarshallerListener(xsw)); marshaller.marshal(customer, xsw); xsw.close();; } } 

Real output

 <?xml version="1.0" ?><!--Before: forum26802450.Customer@18de9738-- ><!--Before: forum26802450.Customer@18de9738-- ><customer><name>Jane</name><!--Before: forum26802450.Address@43e47e37-- ><address><street>123 A Street</street><!--After: forum26802450.Address@43e47e37-- ></address><!--After: forum26802450.Customer@18de9738-- ></customer><!--After: forum26802450.Customer@18de9738-- > 

Formatted output

Here is the formatting result:

 <?xml version="1.0" ?> <!--Before: forum26802450.Customer@18de9738-- > <!--Before: forum26802450.Customer@18de9738-- > <customer> <name>Jane</name> <!--Before: forum26802450.Address@43e47e37-- > <address> <street>123 A Street</street> <!--After: forum26802450.Address@43e47e37-- > </address> <!--After: forum26802450.Customer@18de9738-- > </customer> <!--After: forum26802450.Customer@18de9738-- > 
+14
source

Source: https://habr.com/ru/post/1206419/


All Articles