I am new to JAXB and for the beginning I am marshaling some simple Java files like Hello, world!.
I want to marshal whole file, even with my comments lines placed like this:
/*
* some comment
*/
//another comment
And get them in XML in comment block:
<!--
some comment
-->
<!-- another comment -->
Is there any way to marshal java files with comments?
There are a few hurdles to overcome with your use case:
That being said, below is an approach that may work for you using:  StAX with JAXB and leveraging a Marshaller.Listener.
Customer
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;
    }
}
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 what the output looks like formatted:
<?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-->
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With