web-dev-qa-db-fra.com

Qu'est-il arrivé à NamespacePrefixMapper de JAXB dans JDK6u18

J'utilise com.Sun.xml.bind.marshaller.NamespacePrefixMapper dans mon projet, et je n'ai eu aucun problème avec JDK 6u17. Maintenant, je viens de mettre à jour vers 6u18, et j'ai vu qu'il a été remplacé par com.Sun.xml.internal.bind.marshaller.NamespacePrefixMapper. Cependant, si j'importe cette classe et essaie de compiler mes classes, j'obtiens l'erreur:

 package com.Sun.xml.internal.bind.marshaller n'existe pas 
 import com.Sun.xml.internal.bind.marshaller.NamespacePrefixMapper; 

Je peux accéder à ce package via la fonctionnalité d'achèvement de code NetBeans, et NetBeans ne met pas en surbrillance le code pour les erreurs.

Toute aide serait appréciée!

26
Daniel Szalay

Je ne pense pas que la classe com.Sun.xml.internal.bind.marshaller.NamespacePrefixMapper remplace com.Sun.xml.bind.marshaller.NamespacePrefixMapper, le premier est là depuis longtemps et il PAS VOULU ÊTRE UTILISÉ PAR VOUS AT TOUS (d'où l'emballage internal)).

Le problème ici est que JavaSE 6 n'a pas JAXB RI (il a une implémentation JAXB mais pas JAXB RI) donc si vous voulez vous fier à une fonctionnalité spécifique RI, vous devez regrouper JAXB RI dans votre application (et cela vous protégerait de JAXB change dans Java SE).

18
Pascal Thivent

NamespacePrefixMapper n'est plus utilisable.

Utilisez les annotations dans 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.;

Cela fonctionne avec le JAXB fourni avec JDK7, pour une autre mise à jour de la version JDK JAXB vers 2.2.4.

16
Daniel De León

Vous n'êtes pas censé utiliser com.Sun.** classes directement. Ils sont réputés internes et peuvent être modifiés sans préavis. (Et regardez ce qui vient de se passer !!) Le fait que la nouvelle classe ait internal dans le nom du package est un indice encore plus grand!

Je vous suggère fortement de chercher une meilleure façon de faire ce que vous faites ... qui n'utilise pas le com.Sun.** Des classes.

EDIT - hmmm, on dirait que la personne responsable du JAXB RI a enfreint les règles de Sun concernant les noms de paquetages pour cette extension! Et il est également regrettable que Sun n'ait pas implémenté cette extension RI particulière dans JDK 6.0.

4
Stephen C

Sun avait fait quelque chose de pas tout à fait approprié dans ce cas. Le mappeur d'espace de noms n'est pas inclus dans la spécification, mais il est "annoncé" comme un moyen de personnaliser les préfixes. Donc, les conseils généraux "ne pas utiliser com.Sun.* "ne s'applique pas ici, et le javadoc de cette classe dit:

Implémenté par l'application utilisateur pour déterminer le mappage URI -> préfixe.

Consultez cet article et voyez si cela fonctionnerait pour vous.

4
Bozho

Le message ci-dessous au débordement de pile répond à la question: Définir les espaces de noms Spring JAXB sans utiliser NamespacePrefixMapper

La clé est d'inclure le rt.jar au moment de la construction et de le supprimer de l'application après la compilation.

1
Mr. Doomsbuster

Pour ceux qui utilisent maven, trouvé y compris à la fois JAXB-RI et JAXB pour Java6 via ce lien a fonctionné.

http://mvnrepository.com/artifact/com.googlecode.jaxb-namespaceprefixmapper-interfaces/JAXBNamespacePrefixMapper/2.2.4

1
Steve

J'ai rencontré cela récemment lors du portage d'un code plus ancien dans un nouveau projet. L'ancien projet a très bien été compilé en utilisant ant, mais le nouveau a échoué avec l'erreur que vous mentionnez ci-dessus.

Après quelques recherches, j'ai constaté que l'ancien fichier build.xml utilise une option de compilateur javac pour contourner la restriction ci-dessus:

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

Après l'avoir trouvé, j'ai cherché et trouvé cette autre question de stackoverflow: tilisation de classes Sun internes avec javac

1
Travis