sources plugin generate from example classes java maven jaxb xjc maven-jaxb2-plugin

java - plugin - XmlAdapter no funciona correctamente con la versión más nueva de JAXB



maven-jaxb2-plugin maven (1)

Estoy ejecutando un Proyecto Maven con la siguiente fuente

package com.coderplus.jaxb; import java.util.HashMap; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlJavaTypeAdapter(PropertiesMapAdapter.class) public class PropertiesMap<K,V> extends HashMap<String,String> { }

..

package com.coderplus.jaxb; import java.util.Map.Entry; import javax.xml.bind.annotation.adapters.XmlAdapter; public class PropertiesMapAdapter extends XmlAdapter<Properties, PropertiesMap<String, String>> { @Override public PropertiesMap<String, String> unmarshal(Properties properties) throws Exception { PropertiesMap<String, String> retVal = new PropertiesMap<String, String>(); if (null != properties) { for (Property param : properties.getProperty()) { retVal.put(param.getName(), param.getValue()); } } return retVal; } @Override public Properties marshal(PropertiesMap<String, String> propertiesMap) throws Exception { Properties properties = new Properties(); if (propertiesMap != null) { for (Entry<String, String> entry : propertiesMap.entrySet()) { Property param = new Property(); param.setName(entry.getKey()); param.setValue(entry.getValue()); properties.getProperty().add(param); } } return properties; } }

..

package com.coderplus.jaxb; import javax.xml.bind.*; public class Demo { @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Root.class); Root root = new Root(); PropertiesMap map = new PropertiesMap(); map.put("hello", "World"); map.put("name", "value"); root.setProperties(map); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(root, System.out); } }

...

Esquema en src / main / resources

<?xml version="1.0" encoding="UTF-8" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="Properties"> <xsd:sequence> <xsd:element name="Property" type="Property" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Property"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="name" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:element name="Root"> <xsd:complexType> <xsd:sequence> <xsd:element name="Properties" type="Properties" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>

Archivo de enlace en src / main / resources

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <jaxb:bindings schemaLocation="map.xsd"> <jaxb:bindings node="//xs:element[@name=''Properties'']"> <jaxb:property> <jaxb:baseType name="com.coderplus.jaxb.PropertiesMap&lt;String,String&gt;" /> </jaxb:property> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>

y finalmente el archivo pom

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.coderplus.jaxb</groupId> <artifactId>test</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.9.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <generatePackage>com.coderplus.jaxb</generatePackage> </configuration> </plugin> </plugins> </build> </project>

La clase de demostración produce el siguiente resultado cuando lo ejecuto usando JDK 1.6

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Root> <Properties> <Property name="hello">World</Property> <Property name="name">value</Property> </Properties> </Root>

pero por alguna razón, genera el siguiente con JDK 1.7 y más (¿JAXB más nuevo?)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Root> <properties> <entry> <key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">hello</key> <value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">World</value> </entry> <entry> <key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">name</key> <value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">value</value> </entry> </properties> </Root>

¿Cómo puedo hacer que funcione en JDK 1.7 o en la versión más nueva de JAXB?

Algo más de información:

El plugin maven-jaxb2 genera la clase de abajo junto con otras

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "properties" }) @XmlRootElement(name = "Root") public class Root { @XmlElement(name = "Properties", required = true, type = Properties.class) protected PropertiesMap<String, String> properties; public PropertiesMap<String, String> getProperties() { return properties; } public void setProperties(PropertiesMap<String, String> value) { this.properties = value; } }

Si @XmlJavaTypeAdapter(PropertiesMapAdapter.class) manualmente y agrego la anotación @XmlJavaTypeAdapter(PropertiesMapAdapter.class) como en el siguiente código, entonces funciona

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "properties" }) @XmlRootElement(name = "Root") public class Root { @XmlElement(name = "Properties", required = true, type = Properties.class) @XmlJavaTypeAdapter(PropertiesMapAdapter.class) protected PropertiesMap<String, String> properties; public PropertiesMap<String, String> getProperties() { return properties; } public void setProperties(PropertiesMap<String, String> value) { this.properties = value; } }

¿Cómo puedo hacer que el complemento maven-jaxb2-add el XmlJavaTypeAdapter automáticamente? En caso de que ayude, este enlace tiene el proyecto Maven comprimido


Intente agregar la personalización de xjc: javaType .

<xjc:javaType name="org.acme.foo.PropertiesMap" adapter="org.acme.foo.PropertiesMapAdapter"/>