Jaxb: Como substituir uma classe / associação em uma árvore de objetos fornecida durante a remoção da organização

Eu tenho um determinado conjunto de classes para desmarcar um xml em uma árvore de objetos. Agora eu recebo um xml estendido e quero substituir uma classe na árvore de objetos por uma versão estendida.

Arquivo XML

<?xml version="1.0" encoding="UTF-8"?>
<RootNode_001>
    <systemId>on the 4</systemId>
    <systemName>give me some more</systemName>
    <person>
        <firstname>James</firstname>
        <lastname>Brown</lastname>
        <address>
            <street>Funky</street>
            <city>Town</city>
            <type>HOME</type> <!-- this is the new field -->
        </address>
    </person>
</RootNode_001>

Eu crio uma nova classe de endereço com o novo campo como este:

public class ExtAddress extends Address {
    // inherit from address and add new field
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

Agora eu tento desassociar uma árvore de objetos e esperoExtAddress para fazer parte da árvore assim:

public class Runner {

    public static void main ( String argv[] ) throws Exception {
        File file = new File( "basic.xml" );
        Class cls = RootNode.class;

        // create a context with the root node and the replacement class
        JAXBContext jaxbContext = JAXBContext.newInstance( ExtAddress.class, cls );
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        JAXBElement jaxbElement = unmarshaller.unmarshal( new StreamSource( file ), cls );
        RootNode rootNode = (RootNode) jaxbElement.getValue();

        System.out.println( rootNode.getClass().getName() );
        System.out.println( rootNode.getPerson().getClass().getName()  );
        // this returns Address but I want ExtAddress
        System.out.println( rootNode.getPerson().getAddress().getClass().getName()  );
    }
}

Até agora não uso anotações. O retorno da árvore de objetos não ordenadosAddress e nãoExtAddress. Se eu adicionar umXmlType anotação, recebo uma exceção:

@XmlTyp( name = "address" )
ExtAddress extends Address {
  ...
}

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "address". Use @XmlType.name and @XmlType.namespace to assign different names to them.
    this problem is related to the following location:
        at jaxb.standard.Address
        at jaxb.ExtAddress

Eu tentei muitas coisas, mas isso parece estar muito próximo de uma solução. Como posso dizer ao jaxb para usar uma classe herdada em vez da classe original.

Quero delvier um conjunto de classes padrão em uma biblioteca e poder alterar a árvore de objetos posteriormente como uma extensão quando novos campos em xml aparecerem.

questionAnswers(2)

yourAnswerToTheQuestion