2010-02-01 17 views
1

J'ai créé un client de service Web à l'aide d'Axis2. Je voudrais emballer le client dans un pot, ainsi je peux l'employer dans plusieurs autres projets. Le client utilise le module 'Rempart' Axis2 WS-Security. Ce module, rampart.mar (pas une faute de frappe!) Doit être présent sur le 'chemin du référentiel' de l'Axe, dans un répertoire appelé 'modules'. Le client requiert également un fichier de stratégie de sécurité, policy.xml. Les emplacements de ces deux derniers sont injectés via Spring, mais comme ils ne sont pas sujets à changement, je voudrais les emballer dans le pot.Empaquetage d'un client de service Web Axis2 géré par Spring

Si vous injectez un objet de fichier comme:

<bean id="webserviceStubFactory" class="com.company.WebserviceStubFactory"> 
    <constructor-arg value="classpath:policy.xml"/> 
</bean> 

il fonctionnera très bien lors de l'exécution/tester le projet directement. Toutefois, lorsque vous l'emballer dans un pot, vous obtenez

java.io.FileNotFoundException: class path resource [policy.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/path/to/webservice-0.8.jar!/policy.xml

Ceci est bien connu « problème » Spring: le constructeur-arg est résolu dans une instance printemps ClasspathResource et il ne supporte pas getFile (), car les instances de fichiers ne peuvent pas faire référence à quelque chose dans un pot. La solution à ceci est assez simple: changez le constructeur pour prendre une ressource au lieu d'un dossier et employez le InputStream directement. Toutefois, cela ne fonctionne pas pour le chemin d'accès au référentiel Axis2, car je ne peux que spécifier le chemin d'accès complet au référentiel et les composants internes d'Axis2 déterminent l'emplacement du fichier rampart.mar. Donc, la question se résume essentiellement à: est-il possible d'utiliser Spring pour injecter un chemin à l'intérieur d'un pot (même si c'est seulement /) et d'autres bibliothèques lisent ce chemin comme s'il s'agissait d'un système de fichiers normal? Je suppose que ce n'est pas le cas, mais je voudrais être sûr, avant d'installer des 'dépôts d'axes' externes sur les environnements de développement/test/production et d'avoir plusieurs copies du rampart.mar qui traînent.

Répondre

1

Spring ne peut pas faire grand-chose pour cacher les incohérences de l'API JavaSE sous-jacente. Les diverses méthodes getXYZ sur l'interface Resource sont accompagnées de mises en garde dans la documentation, par ex. pour getFile():

Throws: 
    IOException - if the resource cannot be resolved as absolute file path, 
    i.e. if the resource is not available in a file system 

Une ressource dans un fichier JAR n'est pas « sur un système de fichiers », et donc cela ne marchera jamais.

Dans votre cas, vous devrez contourner les contraintes d'Axis2 pour utiliser les fichiers, mais assurez-vous manuellement qu'un fichier existe. En d'autres termes, utilisez Resource.getInputStream() pour extraire le contenu de la ressource JAR et copiez-le dans un fichier temporaire File sur le système de fichiers local, puis transmettez àFile à Axis2.

+0

Le problème est que Axis2 nécessite un/path/to/donné, alors qu'il recherche /path/to/modules/rampart.mar. Il n'y a pas de fichier à lire dans ce cas. D'un autre côté, passer une référence au fichier policy.xml dans le fichier jar fonctionne très bien, car je peux le passer en tant que ressource. Dans les sources Axis2, je vois qu'il construit une URL complète pour trouver les modules .mar dans le Repository, mais pour une raison quelconque, cela ne fonctionne pas. Comme le temps que je peux consacrer à ce problème est limité, je vais probablement opter pour la solution laide et inclure simplement un rampart.mar dans chaque projet qui utilise celui-ci. : / – Confusion

Questions connexes