with que link dependency inheritance jaxb eclipselink override moxy

inheritance - que - jpa with hibernate



EclipseLink MOXy: anula las reglas de archivos vinculantes (1)

Es un poco extraño mapear la propiedad de text diferente en las clases super y sub. Si esto es algo que realmente quieres hacer, a continuación hay una forma de lograrlo.

Modelo de Java

Superclase

package forum17982654; public class SuperClass { private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } }

Subclase

Anularemos los métodos de acceso de la superclase. Esto nos ayudará a engañar a MOXy para que piense que SubClass tiene su propio text propiedad.

package forum17982654; public class SubClass extends SuperClass { @Override public String getText() { return super.getText(); } @Override public void setText(String text) { super.setText(text); } }

Metadata

bindings.xml

En el documento de mapeo le diremos a MOXy que la súper clase real de SubClass es java.lang.Object .

<?xml version="1.0"?> <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="forum17982654"> <java-types> <java-type name="SuperClass"> <xml-root-element/> <java-attributes> <xml-attribute java-attribute="text"/> </java-attributes> </java-type> <java-type name="SubClass" super-type="java.lang.Object"> <xml-root-element/> <java-attributes> <xml-value java-attribute="text"/> </java-attributes> </java-type> </java-types> </xml-bindings>

Código de demostración

A continuación se muestra un código de demostración que puede ejecutar para probar que todo funciona:

Manifestación

package forum17982654; import java.io.StringReader; import java.util.*; import javax.xml.bind.*; import org.eclipse.persistence.jaxb.JAXBContextFactory; import org.eclipse.persistence.jaxb.JAXBContextProperties; public class Demo { public static void main(String[] args) throws Exception { Map<String, Object> jaxbContextProperties = new HashMap<String, Object>(1); jaxbContextProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "bindings.xml"); JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] {SuperClass.class}, jaxbContextProperties); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); StringReader superClassXML = new StringReader("<superClass text=''Hello Super Class''/>"); SuperClass superClass = (SuperClass) unmarshaller.unmarshal(superClassXML); System.out.println(superClass.getText()); StringReader subClassXML = new StringReader("<subClass>Hello Sub Class</subClass>"); SubClass subClass = (SubClass) unmarshaller.unmarshal(subClassXML); System.out.println(subClass.getText()); } }

Salida

Hello Super Class Hello Sub Class

Me gustaría, en el siguiente escenario, como el enlace de java-type name="SubClass" que se aplicará para establecer el campo de texto en SuperClass. Sin embargo, no lo es. ¿Hay algún problema al anular bindingsA.xml? De acuerdo con la documentación de las reglas de Anulación :

Si se produce el mismo tipo de java en varios archivos, cualquier valor que se establezca en el archivo posterior anulará los valores del archivo anterior.

¿Qué debo hacer para que funcione?

Entrada:

<?xml version="1.0" encoding="UTF-8"?> <a text="A text">B text</a>

Enlaces A:

<?xml version="1.0"?> <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="test"> <java-types> <java-type name="SuperClass"> <xml-root-element name="a"/> <java-attributes> <xml-element java-attribute="text" xml-path="@text" /> </java-attributes> </java-type> </java-types> </xml-bindings>

Vinculaciones B:

<?xml version="1.0"?> <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="test"> <java-types> <java-type name="SuperClass" xml-transient="true"></java-type> <java-type name="SubClass"> <xml-root-element name="a"/> <java-attributes> <xml-element java-attribute="text" xml-path="text()" /> </java-attributes> </java-type> </java-types> </xml-bindings>

Clases:

public class SuperClass { private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } } public class SubClass extends SuperClass { }

Manifestación:

Map<String, Object> jaxbContextProperties = new HashMap<String, Object>(1); List<String> bindings = new LinkedList<String>(); bindings.add("bindingsA.xml"); bindings.add("bindingsB.xml"); jaxbContextProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, bindings); JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] {SuperClass.class}, jaxbContextProperties); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); SuperClass superClass = (SuperClass)unmarshaller.unmarshal(new File("input.xml")); System.out.println(superClass.getText());

Salida:

[EL Warning]: 2013-07-31 16:08:07.771--Ignoring attribute [text] on class [SubClass] as no Property was generated for it. A text