java jaxb simple parsing is requiring @XmlAccessorType(XmlAccessType.FIELD) annotation

25,344

By default JAXB treats public fields and properties as mapped. If you annotate a field it then considers the field and property as mapped causing the conflict. Without @XmlAccessorType(XmlAccessType.FIELD) you should annotate the get or set method.

For More Information

Share:
25,344
code4jhon
Author by

code4jhon

Updated on January 19, 2021

Comments

  • code4jhon
    code4jhon over 3 years

    I am trying to parse an xml to java objects, I've read and implemented the following tutorial:

    http://www.vogella.com/articles/JAXB/article.html (works perfectly)

    But when I create my own clases (similar to those in the tutorial)

    I get: Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions Class has two properties of the same name "clienteList"

    Unless I use @XmlAccessorType(XmlAccessType.FIELD) on class Clientes but in the tutorial is not being used.

    Any ideas ?

    (It works fine with the @XmlAccessorType(XmlAccessType.FIELD) annotation but I want to know why is it being required with my classes while it is not for the classes in the tutorial)

    Thank you in advance for any information.

    Class Cliente

    package mx.com.findep.crediseguros.dto.servicios.finsol;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "cliente")
    public class Cliente {
    
      private String numeroPersona;
    
      @XmlElement(name = "numeroPersona")
      public String getNumeroPersona() {
        return numeroPersona;
      }
    
      public void setNumeroPersona(String numeroPersona) {
        this.numeroPersona = numeroPersona;
      }
    
    } 
    

    Class Clientes

    package mx.com.findep.crediseguros.dto.servicios.finsol;
    
    import java.util.ArrayList;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "clientes")
    //@XmlAccessorType(XmlAccessType.FIELD) //without this line it fails
    public class Clientes {
    
          // XmLElementWrapper generates a wrapper element around XML representation
          @XmlElementWrapper(name = "clienteList")
          // XmlElement sets the name of the entities
          @XmlElement(name = "cliente")
          private ArrayList<Cliente> clienteList;
    
    
          public void setClienteList(ArrayList<Cliente> clienteList) {
            this.clienteList = clienteList;
          }
    
          public ArrayList<Cliente> getClienteList() {
            return clienteList;
          }
    
    
        }
    

    Testing My Marshalling

    package mx.com.findep.crediseguros.dto.servicios.finsol;
    
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    
    
    public class TestClientesXml {
    
      private static final String SOME_XML = "C:/bea/user_projects/domains/DominioDesarrollo/esquemas/calculoCostoSeguroPeticion.xml";
    
      public static void main(String[] args) throws JAXBException, IOException {
    
        ArrayList<Cliente> clienteList = new ArrayList<Cliente>();
    
        Cliente cliente1 = new Cliente();
        cliente1.setNumeroPersona("1");
    
        clienteList.add(cliente1);
    
        Cliente cliente2 = new Cliente();
        cliente2.setNumeroPersona("2");
        clienteList.add(cliente2);
    
        Clientes clientes = new Clientes();
    
        clientes.setClienteList(clienteList);
    
        JAXBContext context = JAXBContext.newInstance(Clientes.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    
        m.marshal(clientes, System.out);
    
        m.marshal(clientes, new File(SOME_XML));
    
        System.out.println();
        System.out.println("Output from our XML File: ");
        Unmarshaller um = context.createUnmarshaller();
        Clientes clientes2 = (Clientes) um.unmarshal(new FileReader(SOME_XML));
        ArrayList<Cliente> list = clientes2.getClienteList();
        for (Cliente cliente : list) {
          System.out.println("Cliente: " + cliente.getNumeroPersona());
        }
      }
    }