C'est juste là, dans le paquet qu'il devrait indexer. Pourtant, quand j'appelle
JAXBContext jc = JAXBContext.newInstance("my.package.name");
J'obtiens une JAXBException disant que
"mon nom de paquet" ne contient pas ObjectFactory.class ou jaxb.index.
bien qu'il contienne les deux.
Ce qui fonctionne, mais qui n'est pas tout à fait ce que je veux, c'est
JAXBContext jc = JAXBContext.newInstance(my.package.name.SomeClass.class);
Cette question, posée par d'autres personnes, apparaît sur un certain nombre de listes de diffusion et de forums, mais ne semble pas recevoir de réponse.
Je l'exécute sous OpenJDK 6, j'ai donc récupéré les paquets sources et j'ai intégré mon débogueur dans la bibliothèque. Il commence par chercher jaxb.properties, puis cherche les propriétés du système et ne trouvant ni l'un ni l'autre, il essaie de créer le contexte par défaut en utilisant com.sun.internal.xml.bind.v2.ContextFactory. C'est là que l'exception est levée (à l'intérieur de ContextFactor.createContext(String ClassLoader, Map)
), mais je ne peux pas voir ce qui se passe car la source n'est pas là.
ETA :
A partir du code source de ContentFactory, j'ai trouvé aquí Dans le cas de l'utilisation d'une carte de crédit, c'est probablement la partie du code qui ne fonctionne pas comme prévu :
/**
* Look for jaxb.index file in the specified package and load it's contents
*
* @param pkg package name to search in
* @param classLoader ClassLoader to search in
* @return a List of Class objects to load, null if there weren't any
* @throws IOException if there is an error reading the index file
* @throws JAXBException if there are any errors in the index file
*/
private static List<Class> loadIndexedClasses(String pkg, ClassLoader classLoader) throws IOException, JAXBException {
final String resource = pkg.replace('.', '/') + "/jaxb.index";
final InputStream resourceAsStream = classLoader.getResourceAsStream(resource);
if (resourceAsStream == null) {
return null;
}
De mon précédent expérience Je suppose que cela a à voir avec les mécanismes de chargement des classes du conteneur OSGi dans lequel il est exécuté. Malheureusement, je suis encore un peu dépassé par les événements.