Pourquoi ne JAXBContext doivent être spécifiquement dit à propos d'une classe qui est déjà dans le paquet?
Ce programme:
import foo.bar.baz.ClassSpecificallyIncluded;
import javax.xml.bind.JAXBContext;
public class A {
public static void main(String[] args) throws Exception {
System.out.println(JAXBContext.newInstance(ClassSpecificallyIncluded.class).toString());
System.out.println(JAXBContext.newInstance("foo.bar.baz").toString());
}
}
produit de sortie différente de la première et de la deuxième JAXBContext:
jar:file:/C:/dev/trunk/rt/tomcat/shared/lib/webservices-rt-2.0.1.jar!/com/sun/xml/bind/v2/runtime/JAXBContextImpl.class Construire-Id: 1.0
Les Classes connues à ce contexte:
[B
boolean
octet
char
foo.bar.baz.Class1
foo.bar.baz.Class1$NestedClass
foo.bar.baz.Class2
foo.bar.baz.ClassSpecificallyIncluded
foo.bar.baz.AnotherClass
com.soleil.xml.bind.l'api.CompositeStructure
double
flotteur
int
java.awt.Image
java.io.Fichier
java.lang.Boolean
java.lang.Octet
java.lang.Caractère
java.lang.Class
java.lang.Double
java.lang.Flotteur
java.lang.Entier
java.lang.Long
java.lang.Objet
java.lang.Court
java.lang.Chaîne
java.lang.Void
java.les mathématiques.BigDecimal
java.les mathématiques.BigInteger
java.net.URI
java.net.URL
java.util.Calendrier
java.util.Date
java.util.GregorianCalendar
java.util.UUID
javax.l'activation.DataHandler
javax.xml.bind.JAXBElement
javax.xml.type de données.Durée
javax.xml.type de données.XMLGregorianCalendar
javax.xml.espace de noms.QName
javax.xml.transformer.Source
long
court
voidjar:file:/C:/dev/trunk/rt/tomcat/shared/lib/webservices-rt-2.0.1.jar!/com/sun/xml/bind/v2/runtime/JAXBContextImpl.class Construire-Id: 1.0
Les Classes connues à ce contexte:
[B
boolean
octet
char
foo.bar.baz.Class1
foo.bar.baz.Class1$NestedClass
foo.bar.baz.Class2
<<< CLASSE qui MANQUE ICI>>>
foo.bar.baz.AnotherClass
com.soleil.xml.bind.l'api.CompositeStructure
double
flotteur
int
java.awt.Image
java.io.Fichier
java.lang.Boolean
java.lang.Octet
java.lang.Caractère
java.lang.Class
java.lang.Double
java.lang.Flotteur
java.lang.Entier
java.lang.Long
java.lang.Objet
java.lang.Court
java.lang.Chaîne
java.lang.Void
java.les mathématiques.BigDecimal
java.les mathématiques.BigInteger
java.net.URI
java.net.URL
java.util.Calendrier
java.util.Date
java.util.GregorianCalendar
java.util.UUID
javax.l'activation.DataHandler
javax.xml.bind.JAXBElement
javax.xml.type de données.Durée
javax.xml.type de données.XMLGregorianCalendar
javax.xml.espace de noms.QName
javax.xml.transformer.Source
long
court
void
Et pourtant, ClassSpecificallyIncluded est dans le foo.bar.baz package:
//
//This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6
//See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
//Any modifications to this file will be lost upon recompilation of the source schema.
//Generated on: 2012.05.14 at 10:47:17 PM IST
//
package foo.bar.baz;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"applicationArea",
"dataArea"
})
@XmlRootElement(name = "ClassSpecificallyIncluded")
public class ClassSpecificallyIncluded {...
Le classpath et le chargeur de classe sont les mêmes pour les deux JAXBContexts.
Alors pourquoi ne pas la deuxième JAXBContext savoir sur ClassSpecificallyIncluded?
OriginalL'auteur Jim Showalter | 2013-11-28
Vous devez vous connecter pour publier un commentaire.
La réponse à votre question est effectivement la réponse est ici:
Pouvez-vous trouver toutes les classes dans un package à l'aide de la réflexion?
Réponse:
Pas de Par sa conception, java ne sait pas et ne peut pas trouver chaque classe dans un package. Java est construit sur le concept de "Juste à temps". Qui, à cette fin signifie que java ne sait pas ce qu'il a jusqu'à ce qu'il a demandé quelque chose de particulier.
Alors à partir de ce point de vue, JAXB a aucun moyen de savoir ce que les classes sont dans un package.
Il serait gênant si JAXB devait être dit précisément chaque classe, à chaque fois que vous besoin de contexte. Donc, en tant que méthode de convenance JAXB vous offre la possibilité de fournir un nom de package.
Afin de contourner les limitations de java il tente de charger à partir de ce package d'une
ObjectFactory
et unjaxb.index
fichier. Il peut le faire parce qu'ils sont des noms propres. Si l'on est trouvé, il les utilise comme un manifeste de l'emballage. Si aucun n'est trouvé, il n'a aucune option mais pour l'abandonner parce qu'il ne peut pas savoir ce qui est dans le package.OriginalL'auteur Philip Couling
La création d'un JAXBContext sur un Nom de Package
Supposons que j'ai les classes suivantes dans un répertoire appelé
forum20273355
:Si je crée un
JAXBContext
en utilisant le code suivant:Alors j'aurai l'exception suivante:
La spécification d'un
jaxb.index
ouObjectFactory
Ci-dessous, nous allons créer un
jaxb.index
fichier etObjectFactory
qui sera la cause de laPerson
classe d'être traitées pour voir ce qui se passe.jaxb.l'indice de
jaxb.index
est un fichier texte qui contient un retour chariot séparé liste des noms de classe.ObjectFactory
Traitées Classes
Évidemment
Person
a été traitée, mais c'était super classeMammal
et la classe de référenceAddress
. La classe qui n'a pas été traitée a été la sous-classeCustomer
.L'obtention de la sous-classe Traitées
Évidemment, nous aurions pu ajouter la sous-classe
Customer
à lajaxb.index
ouObjectFactory
. Nous pouvons également tirer parti de la@XmlSeeAlso
annotation pour ce faire.Maintenant
Customer
est traitée ainsi.Mise à JOUR
Tout ce que vous avez écrit dans votre commentaire, c'est vrai. Ce qui manque, c'est que le
jaxb.index
fichier ouObjectFactory
classe est requise pour le coup de la procédure. Quand un modèle est généré à partir d'un schéma XML unObjectFactory
est généré contenant toutes les références nécessaires à l'amorçage du modèle. Lorsque vous démarrez à partir des classes Java, je vous recommande d'amorçage à partir des classes Java à la place du nom du paquet, mais les mêmes règles s'appliquent.Vrai, les noms de package de spécifier où les métadonnées seront cherchés.
Vrai.
Vrai, le paquet annotations sera certainement appliquée.
Votre commentaire est vrai, et n'entre pas en conflit avec ma réponse. J'ai ajouté une mise à jour pour fournir plus d'informations.
Hm. Le ObjectFactory dans ce package n'a pas un QName pour ClassSpecificallyIncluded. (Ce n'est pas mon colis, juste à essayer de l'utiliser). N'avais pas remarqué ça avant. Mais ClassSpecificallyIncluded n'est pas une sous-classe ou classe mère. C'est par lui-même. Il serait donc anormal être nécessaire d'ajouter XmlSeeAlso. De toute façon, il semble que le paquet n'a pas été correctement généré, et donc le problème. Merci pour votre réponse!
OriginalL'auteur bdoughan