2009-05-26 7 views
0

J'ai un service Web simple qui utilise une base de données Oracle. Lorsque je teste le service en interne, il fonctionne correctement, cependant, l'appel du service Web via mon client (sur la même machine mais dans un fichier WAR différent) lance une invocationtargetexception. J'ai finalement découvert que c'est un problème avec l'instanciation du pilote Oracle. Il ne lance aucune exception, donc je ne peux pas savoir quelle est l'erreur. Google n'a fourni qu'une solution d'utilisation de oracle.jdbc.driver.OracleDriver au lieu de oracle.jdbc.OracleDriver mais cela ne semble pas résoudre quoi que ce soit. Le fichier jar que j'utilise est ojdbc14.jar et, pour autant que je sache, il est inclus dans le chemin de la classe pour le service web ... car il fonctionne quand je teste le service avec une méthode simple.L'instanciation des résultats du pilote Oracle dans InvocationTargetException

EDIT: La InvocationTargetException est générée par une AxisFault à partir du serveur Axis. L'invocationtargetexception est une classe wrapper, et mes tentatives d'extraction de l'exception à l'aide de .getCause() renvoient toujours null.

Je déploie le service en utilisant jboss et incluait le fichier JAR du pilote dans la bibliothèque pour la source mais pas pour le serveur. Y compris le pilote dans/jboss/server/default/lib l'a résolu.

+0

peut vous envoyer toute exception? –

+0

En particulier, quelle est l'exception qui a provoqué l'exception. –

+0

La question dit qu'il ne lève pas une exception - mais InvocationTargetException est une exception qui est clairement instanciée.Plus de détails sur l'exception seraient certainement utiles - voir ma réponse ci-dessous pour une estimation totale qui n'est probablement pas assez bien informée pour réellement aider. – Jared

Répondre

0

2 WARs? Je suppose que votre fichier ojdbc.jar se trouve dans WEB-INF/lib du fichier WAR du service Web.

Peut-être que votre fichier WAR se trouve dans un fichier EAR, vous devez donc référencer le pilote dans MANIFEST.MF.

Plus d'info: http://java.sun.com/j2ee/verified/packaging.html

+0

Oui, deux EAR différents est ce que je voulais dire. J'écris le service Web ainsi que le client. Je vais devoir regarder dans le MANIFEST; Je l'ai regardé mais n'ai jamais vraiment su ce qu'il a fait. – ravun

0

Sans plus d'informations, il est difficile de fournir des suggestions concrètes; J'ai cependant eu de l'expérience avec un pilote Oracle qui tente de se connecter via des bibliothèques OCI natives, ne parvient pas à trouver ces bibliothèques installées sur le système et déclenche une exception InvocationTargetException. Tout cela vient d'une mémoire très vague, donc votre kilométrage variera certainement. Cela fait un moment, mais si ma mémoire est bonne, j'ai eu un cas où l'URL de connexion a été mal configurée, et OracleDriver (ou l'un de ses wrappers) a parcouru un ensemble de méthodes de connexion possibles, essayant d'en trouver un travaillé. Dans le cas où l'URL était correctement configurée, elle n'atteignait jamais la tentative d'OCI (la tentative de connexion fine arrivait en premier), mais si l'URL de connexion était mal configurée, la tentative échouait, provoquant la tentative d'OCI, qui échouait (. entraînant une InvocationTargetException) parce que le client OCI n'a pas été installé sur l'hôte

Ainsi, certaines choses à vérifier:

  1. est l'URL de connexion valide? Si vous utilisez la même URL de connexion aux deux endroits, êtes-vous sûr que les deux processus sont liés à la même carte réseau? Si elles sont liées à des cartes réseau différentes, cela peut provoquer des bizarreries de connexion, même sur le même hôte.
  2. L'environnement est-il le même dans les deux cas? Si le client OCI est utilisé dans votre environnement de développement, il existe probablement plusieurs variables d'environnement dont il dépend. Si ces variables d'environnement ne sont pas définies de manière identique dans l'environnement où le conteneur de servlet est en cours d'exécution, je m'attendrais à un comportement différent.