eclipselink / Moxy: herança e nome do atributo carregado com base no tipo

Estou enfrentando um problema de marshalling / unmarshalling envolvendo herança e polimorfismo usando a implementação JAXB do MOXY e o arquivo de ligações externas de metadado

Não tenho controle sobre os arquivos XML ou as classes de model

Existem várias classes dentro do modelo que herdam outras classes de DTO. Aqui está um exemplo do ambiente em que estou trabalhando. Este exemplo é apenas para fins de sintaxe, o ambiente real envolve herança aninhada, coleções etc.:

Aqui está a classe que será herdada

  class A {

        private String name;

        public String getName(){
              return name;
        }

        public void setName(String value){
              name = value;
        }

  } 

Aqui está uma classe herdada

  class B extends A {

        private String attrFromB;

        public String getAttrFromB(){
              return attrFromB;
        }

        public void setAttrFromB(String value){
              attrFromB = value;
        }
  } 

E outr

  class C extends A {

        private String attrFromC;

        public String getAttrFromC(){
              return attrFromC;
        }

        public void setAttrFromC(String value){
              attrFromC= value;
        }
  } 

Aqui está uma classe de contêiner

  class MyContainerClass{

        private A myObject;

        public A getMyObject(){
           return myObject;
        }

        public void setMyObject(A value){
           myObject = value;
        }
  }

Aqui está o XML que ele deve produzir no caso de MyContainer contendo A

  <MyContainer>
        <MyObject nameA="foo" />
  </MyContainer>

MyContainer contendo B

  <MyContainer>
        <MyObject nameB="foo" attrFromB="bar" />
  </MyContainer>

E MyContainer contendo C

  <MyContainer>
        <MyObject nameC="foo" attrFromC="bar" />
  </MyContainer>

Então você já pode ver problemas no horizonte ...

Aqui está o arquivo de mapeamento que eu escreveria:

  <?xml version="1.0"?>
     <xml-bindings 
        xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
        package-name="com.test.example"
        version="2.1">  

        <java-type name="A" xml-accessor-type="NONE">
           <xml-root-element name="MyObject" />
           <java-attributes>
              <xml-element java-attribute="name" xml-path="@nameA" />
           </java-attributes>
        </java-type>  

        <java-type name="B" xml-accessor-type="NONE">
           <xml-root-element name="MyObject" />
           <xml-see-also>
              com.test.example.A
           </xml.see.also>
           <java-attributes>
              <xml-element java-attribute="name" xml-path="@nameB" />
              <xml-element java-attribute="attrFromB" xml-path="@attrFromB" />
           </java-attributes>
        </java-type>

        <java-type name="C" xml-accessor-type="NONE">
           <xml-root-element name="MyObject" />
           <xml-see-also>
              com.test.example.A
           </xml.see.also>
           <java-attributes>
              <xml-element java-attribute="name" xml-path="@nameC" />
              <xml-element java-attribute="attrFromC" xml-path="@attrFromC" />
           </java-attributes>
        </java-type>

        <java-type name="MyContainer" xml-accessor-type="NONE">
           <xml-root-element name="MyContainer" />
           <java-attributes>
              <xml-element java-attribute="myObject" type="com.test.example.A" xml-path="MyObject" />
           </java-attributes>
        </java-type>

     </xml-bindings>

O primeiro problema é que, se eu ligar as classes assim, recebo a seguinte exceção:

  [Exception [EclipseLink-44] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
  Exception Description: Missing class indicator field from database row [UnmarshalRecord()].

1ª pergunta: Entendo que isso é normal, o Jaxb precisa de alguma maneira de determinar o tipo de atributo MyContaioner.myObject. O problema é que não tenho acesso aos arquivos XML recebidos, portanto não posso adicionar campos xsi: type a eles. Existe uma maneira de determinar uma classe com base na presença de um atributo específico nela? independentemente do seu valor. Se o xml de origem contiver um atributo @attrFromC, eu sei que o objeto deve ser do tipo C. Se ele contém attrFromB, é B.

O segundo problema é que o atributo "name" não existe dentro de B e C, então o jaxb os ignor

  --Ignoring attribute [name] on class [com.test.example.B] as no Property was generated for it.
  --Ignoring attribute [name] on class [com.test.example.C] as no Property was generated for it.

Segunda pergunta: O outro problema é que não sei se o Jaxb é capaz de substituir nomes de atributos xml como é esperado dentro do arquivo XML (@nameA, @nameB e nameC todos se referindo a A.name), existe uma maneira de fazê-lo ?

Agradeço antecipadamente pelo seu tempo

questionAnswers(2)

yourAnswerToTheQuestion