xmlrootelement xmlns ns2 namespaceprefixmapper namespace example java jaxb

java - xmlns - ¿Qué pasó con el NamespacePrefixMapper de JAXB en JDK6u18?



ns2 xml java (7)

He estado usando com.sun.xml.bind.marshaller.NamespacePrefixMapper en mi proyecto, y no tuve ningún problema con ello en JDK 6u17. Ahora acabo de actualizar a 6u18, y vi que ha sido reemplazado por com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper . Sin embargo, si importo esta clase e intento compilar mis clases, obtengo el error:

package com.sun.xml.internal.bind.marshaller does not exist import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;

Puedo acceder a este paquete a través de la función de finalización de código de NetBeans, y NetBeans no resalta el código de errores.

¡Cualquier ayuda sería apreciada!


El NamespacePrefixMapper ya no se puede usar.

Utilice las anotaciones en package-info.java :

@javax.xml.bind.annotation.XmlSchema(namespace = "http://nameSpaceUri" , xmlns = { @XmlNs(prefix = "myPrefix", namespaceURI = "http://nameSpaceUri") } , elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package my.package.;

Esto funciona con JAXB incluido con JDK7, para otra versión de JDK que actualice JAXB a 2.2.4.



Me encontré con esto recientemente al trasladar un código anterior a un nuevo proyecto. El antiguo proyecto se compiló usando ant, pero el nuevo falló con el error que mencionaste anteriormente.

Después de algunas excavaciones, descubrí que el antiguo archivo build.xml usa una opción de compilador javac para omitir la restricción anterior:

<javac srcdir="${srcDir}" destdir="${outputDir}" classpathref="classpath" debug="on"> <compilerarg value="-XDignore.symbol.file" /> </javac>

Después de encontrarlo, busqué y encontré esta otra pregunta de : uso de clases internas de sol con javac


No creo que la clase com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper sea ​​un reemplazo de com.sun.xml.bind.marshaller.NamespacePrefixMapper , la primera está ahí por mucho tiempo y NO SIGNIFICA LO UTILICE USTED EN TODO (de ahí el embalaje internal ).

El problema aquí es que JavaSE 6 no tiene JAXB RI (tiene una implementación JAXB pero no JAXB RI), por lo que si desea confiar en una característica específica de RI, debe incluir JAXB RI en su aplicación (y eso lo protegería). de los cambios de JAXB en Java SE).


No debes usar las clases com.sun.** directamente. Se consideran internos y están sujetos a cambios sin previo aviso. (¡Y mira lo que acaba de suceder!) ¡El hecho de que la nueva clase tenga internal nombre internal en el paquete es una sugerencia aún mayor!

Le sugiero que busque una mejor manera de hacer lo que está haciendo ... que no utiliza las clases com.sun.**

EDITAR - hmmm, ¡parece que el responsable de JAXB RI ha roto las reglas de Sun sobre los nombres de paquetes para esa extensión! Y también es lamentable que Sun no haya implementado esta extensión de RI en particular en JDK 6.0.



Sun había hecho algo no muy apropiado en este caso. El asignador de espacio de nombres no se incluye en la especificación, pero se "anuncia" como una forma de personalizar los prefijos. Así que el consejo general "no use com.sun.* " No se aplica aquí, y el javadoc de esta clase dice:

Implementado por la aplicación de usuario para determinar URI -> asignación de prefijo.

Consulte este artículo y vea si funcionaría para usted.