简体   繁体   中英

How to use inheritance in jaxb?

I have an abstract class address, and two classes that inherit from class address..

classA and classB.

So I found in google the annotation @xmlSeeAlso I used this, but I don´t know if it´s correct...

Because the stackTrace prints this error

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 11 counts of IllegalAnnotationExceptions
Class has two properties of the same name "bairro"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getBairro()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.bairro
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "cep"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getCep()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.cep
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "codigoMunicipio"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getCodigoMunicipio()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.codigoMunicipio
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "codigoPais"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getCodigoPais()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.codigoPais
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "complemento"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getComplemento()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.complemento
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "logradouro"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getLogradouro()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.logradouro
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "municipio"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getMunicipio()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.municipio
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "numero"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getNumero()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.numero
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "pais"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getPais()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.pais
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "telefone"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getTelefone()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.telefone
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
Class has two properties of the same name "UF"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getUF()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.UF
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc

    at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
    at javax.xml.bind.ContextFinder.find(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at nfeProc.Teste.main(Teste.java:15)

So what´s wrong?

UPDATE

put my code in pastebin.. To explain for you, my classes emitente and destinatario have a field with a endereco (adress) from from enderecoEmitente and enderecoDestinario and they extends from Endereco http://pastebin.com/db0M3rG5

Using your code on paste bin all I had to do was add @XmlAccessorType(XmlAccessType.FIELD) to the Endereco` to get everything to work correctly (since that class has annotated fields).

@XmlAccessorType(XmlAccessType.FIELD)
public class Endereco {

Problem

The problem you are encountering isn't related to inheritance but to the fact that you have annotated the field instead of the property. By default a JAXB implementation will treat public properties and annotated fields as mapped (see: http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html ), this is causing the conflict in your use case:

Class has two properties of the same name "pais"
    this problem is related to the following location:
        at public java.lang.String nfeProc.NFe.infNFe.Endereco.getPais()
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc
    this problem is related to the following location:
        at private java.lang.String nfeProc.NFe.infNFe.Endereco.pais
        at nfeProc.NFe.infNFe.Endereco
        at private nfeProc.NFe.infNFe.Endereco nfeProc.NFe.infNFe.emit.Emitente.endereco
        at nfeProc.NFe.infNFe.emit.Emitente
        at private nfeProc.NFe.infNFe.emit.Emitente nfeProc.NFe.infNFe.InfNFe.emitente
        at nfeProc.NFe.infNFe.InfNFe
        at private nfeProc.NFe.infNFe.InfNFe nfeProc.NFe.NFe.infNFe
        at nfeProc.NFe.NFe
        at private nfeProc.NFe.NFe nfeProc.NFeProc.nfe
        at nfeProc.NFeProc

Solution

The solution is to either annotate the get method (or set method), or annotate the field and specify @XmlAccessorType(XmlAccessType.FIELD) at the class or package level.

JAXB & Inheritance

I have written a lot about JAXB and inheritance, you may find the following helpful:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM