javaxmljacksonpojoxmlmapper

Serialize Java List to XML using Jackson XML mapper


Hi I need to create an XML from JAVA using Jackson-dataformat XMLMapper. The XML should be like

<Customer>
  <id>1</id>
  <name>Mighty Pulpo</name>
    <addresses>
      <city>austin</city>
      <state>TX</state>
    </addresses>
    <addresses>
      <city>Hong Kong</city>
      <state>Hong Kong</state>
    </addresses>
</Customer>

But I get it always like with an extra "< addresses> < /addresses>" tag.

<Customer>
  <id>1</id>
  <name>Mighty Pulpo</name>
<addresses>
    <addresses>
      <city>austin</city>
      <state>TX</state>
    </addresses>
    <addresses>
      <city>Hong Kong</city>
      <state>Hong Kong</state>
    </addresses>
<addresses>
</Customer>

I am using below code to create XML

JaxbAnnotationModule jaxbAnnotationModule = new JaxbAnnotationModule();
XmlMapper mapper = new XmlMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(jaxbAnnotationModule);
mapper.registerModule(new GuavaModule());
String xml = mapper.writeValueAsString(customer);
System.out.println(xml);

Please can some one help me? How can I remove the extra tag please. I have tried to use @XmlElement but it does not help help. TIA!!


Solution

  • Try the below code

    @JacksonXmlRootElement(localName = "customer") 
    class Customer {
    
        @JacksonXmlProperty(localName = "id")
        private int id;
        @JacksonXmlProperty(localName = "name")
        private String  name;
    
        @JacksonXmlProperty(localName = "addresses")
        @JacksonXmlElementWrapper(useWrapping = false)
        private Address[] address;
    
        // you can add it on getter method instead of declaration.  
        @JacksonXmlElementWrapper(useWrapping = false)
        public Address[] getAddress(){ 
            return address;
       }
    
       //getters, setters, toString             
    }
    
    class Address {
    
        @JacksonXmlProperty(localName = "city")
        private String city;
    
        @JacksonXmlProperty(localName = "state")
        private String state;
        // getter/setter 
    }