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!
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).
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.
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.
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.
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.
Pour ceux qui utilisent maven, trouvé y compris à la fois JAXB-RI et JAXB pour Java6 via ce lien a fonctionné.
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