2010-11-10 52 views
2

Je dois modifier l'implémentation par défaut dans mon projet pour org.w3c.dom.Document.Modification de l'implémentation par défaut de org.w3c.dom.Document

J'ai suivi this link pour modifier l'implémentation par défaut pour:

javax.xml.parsers.DocumentBuilderFactory 
javax.xml.parsers.SAXParserFactory 
javax.xml.transform.TransformerFactory 

J'ai créé 3 fichiers avec les noms ci-dessus avec en META-INF/services et mis dans chacune des lignes suivantes:

Dans le fichier: javax.xml.parsers.DocumentBuilderFactory je mets: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

Dans le fichier: javax.xml.parsers.SAXParserFactory je mets: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

Dans le fichier: javax.xml.transform.TransformerFactory je mets: org.apache.xalan.processor.TransformerFactoryImpl

Mais quand je déployé sur Oracle Application Server je suis arrivé que la classe de mise en œuvre de org.w3c.dom.Document est: oracle.xml.parser.v2.XMLDocument au lieu de com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl qui est en cours d'impression en développement sur la jetée.

Je développe sur Jetty et le déploiement sur le serveur d'applications Oracle.

Répondre

1

Il semble que vous fassiez la bonne chose. Mais il pourrait être plus simple d'utiliser la méthode des propriétés du système ... au moins jusqu'à ce que vous puissiez comprendre ce qui ne va pas avec la méthode "services".

+1

Le mécanisme de services concerne les composants qui fournissent un service annonçant qu'ils le font. Il s'agit de fournir un choix. Il ne s'agit pas * de * spécifier * quel * choix à faire, et me fier à classpath ordering pour l'utiliser pour faire cela qui me semble être un kludge. La méthode des propriétés système est un moyen de faire un choix explicite, et c'est donc la bonne façon de le faire ici. –

+0

@ Tom Anderson - pour la défense de l'OP, ma lecture du document lié est que l'approche «services» devrait fonctionner. Et j'ai trouvé d'autres résultats de recherche qui suggèrent que c'est aussi vrai pour la SV. Cependant, je dois admettre que la façon dont le document est formulé laisse planer un doute et je n'ai pas pu trouver de documentation spécifique à l'OEA. –

+0

oui, vous avez raison. L'approche des services devrait vraiment fonctionner partout, car elle fait partie de l'ECJ. Je pense simplement qu'il vaut mieux être explicite. –

1

L'implémentation oracle.xml.parser.v2.XMLDocument pour org.w3c.dom.Document est peut-être trouvée avant com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl par le classloader. Vérifiez s'il est possible d'exclure l'implémentation Oracle, recherchez le fichier contenant la classe. Cela peut se trouver dans un dossier "container wide" et votre implémentation dans un dossier "application wide".

N'avez pas eu exactement le même problème, mais similaire, où l'ordre des pots chargés par le chargeur de classe était important. Espérons que cela peut vous donner un coup de pouce dans la bonne direction au moins

+0

Ya, je sais que c'est le problème .... la commande de JARS sur le classpath .. mais de manière incontrôlée, je déploie sur un serveur de prod qui a l'autre application qui fonctionne, signifiant que je ne peux pas faire le changement -wdie "configs :) –

0

Deux choses à noter: 1.
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl a un indice pour vous: il est une implémentation interne (par opposition à l'API publique). Il est sujet à changement et ne devrait pas être le premier choix pour le développement de la production.
2. J'ai trouvé que com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl est la meilleure implémentation qui correspond à tous mes besoins et pour autant que je sache, elle correspond à la spécification.

Vous pouvez facilement voir un conflit. J'espère qu'un jour il y aura une plate-forme standard, une API publique pour une implémentation de Document et pour toutes ses usines et autres.

Voici mon expérience:

jouer avec META-INF/services et commande JAR dans le classpath senti comme un hack, a travaillé encore pire et à la fin, je me suis déplacé loin de cette approche. Voici pourquoi cela n'a pas fonctionné pour moi: il y avait 2+ implémentations de tiers sur le classpath, donc il n'y avait aucun espoir d'obtenir .xerces.internal. par défaut. Cependant, le spécifier aussi haut que la propriété système le surchargerait pour tout, ce qui n'a pas fonctionné pour les produits tiers.

• • • J'ai fini par créer une propriété et charger l'usine précise que je voulais explicitement, sans en utilisant le mécanisme de recherche via les propriétés META-INF/services et du système. Par ailleurs, différentes usines utilisent différentes étapes de recherche, ce qui est incohérent et J'espère qu'Oracle peut trouver un moyen de standardiser ce processus et de le rendre plus flexible et contrôlable..