L'injection de dépendance avec le Printemps (JSR 330 annotations) dans WebSphere 7 ne fonctionne pas
J'ai une application d'entreprise construit avec Java 6, Spring Framework 3.1.2 et de Mule ESB 3.3.0, entre autres bibliothèques ne sont pas liées à cette question.
Nos haricots et les services sont tous déclarés avec @Named
et @Inject
JSR 330 annotations, respectivement pour le réglage automatique de composant de balayage et d'injection de dépendance (pas d'Ejb, au seul service des haricots). Lorsqu'il est déployé dans JBoss 4.2.3 (notre environnement de test) tout fonctionne bien. Toutefois, lorsqu'il est déployé dans WebSphere 7, la JSR 330 annotations semblent ne pas avoir de travail. Les haricots marqué avec @Named
sont tout simplement pas détecté, à tous.
Je peux vous assurer que tout est configuré à droite (puisque c'est de travailler dans JBoss). Plus précisément, le <context:component-scan />
a la base-package
attribut correctement définie et la scope-resolver
attribut correctement configuré pour utiliser Jsr330ScopeMetadataResolver
(nous avons essayé sans trop).
Je suis conscient de WebSphere 7 (7.0.0.23) ne peut pas soutenir ce genre d'annotations. Je suis encore à tester avec @Component
et @Autowired
Printemps équivalents. Malheureusement, nous aimerions beaucoup à l'utilisation de la JSR 330 annotations afin que nos classes ne serait pas directement dépendent de Printemps, même si nous sommes à l'aide de Spring Framework sous le capot.
Néanmoins, même si j'avais passé une œuvre complète du jour à la recherche pour une certaine instruction que WebSphere 7 ne prend pas en charge la JSR 330 annotations, je n'ai rien trouvé jusqu'à présent.
De plus, je ne vois pas pourquoi cela ne fonctionnerait pas, depuis que je suis en supposant que le Framework Spring est celui qui fait tout le travail, par le biais de la <context:component-scan />
directive dans le application-context.xml
fichier.
Quelqu'un peut-il apporter un peu de lumière sur cette question?
Est-il un moyen d'activer l'injection de dépendance via des annotations dans WebSphere 7?
Si je passe en arrière de la JSR 330 @Named
/@Inject
annotations de Spring propre @Component
et @Autowired
est-il susceptible de travailler?
Dans une tentative désespérée, puis-je prolonger le Printemps ComponentScanBeanDefinitionParser
de sorte qu'il détecte la JSR 330 annotations même dans WebSphere 7?
Si rien ne fonctionne, je vais finir par revenir à la plaine de configuration XML. Qui est hautement indésirable, cependant, parce qu'il y aura des centaines de haricots être configuré manuellement dans le fichier XML.
- Je suis certain que le Printemps annotations fonctionne. Je n'ai jamais essayé avec de l'appelé et l'Injecter. Il n'est pas surprenant que WebSphere ne prend pas en charge elle - logiciel IBM est terrible.
- Tous les CDI des trucs que j'ai vu pour WebSphere commence à la version 8, mais je suis d'accord je ne peux pas trouver une réponse définitive à cet effet. C'est certainement dans le v8 de la documentation. ibm.biz/BdxmBv
Vous devez vous connecter pour publier un commentaire.
WebSphere 8 semble être la version correcte à utiliser; il soutient EE6 (WebSphere 7 est EE5), qui à son tour contient CDI 1.0 (d'où la JSR 299).
Ci-dessous est un extrait de DeveloperWorks qui résume la relation entre WebSphere versions, JSR JSR 299 et 300
J'ai finalement venu avec une solution de contournement en étendant les deux Composants de Numérisation et de Autowire fonctionnalités du Framework Spring.
Tout d'abord, j'ai ajouté une inclusion de filtre pour le Composant Scanner de sorte que
@Named
annotations ont également été considérés comme éligibles pour la détection et l'enregistrement pour le Printemps Conteneur:Par la suite, j'ai également ajouté un haricot définition de
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
, l'extension de l'permettra à l'autowiring admissibilité à@Inject
annotations:D'abord, cela a bien fonctionné pour "réactiver" le
@Named
et@Inject
annotations. Cependant, j'ai toujours eu quelques problèmes de conflit de haricots sur le autowire candidats processus de résolution. Cela était dû à des différences dans le processus de résolution par défaut du Printemps et de la JSR 330. Ce n'était pas un gros problème, puisque seule une poignée de haricots est tombé dans ce scénario. Ils ont tous été résolus par l'ajout de certains stratégiquement placé@Qualifier
annotations.Maintenant tout fonctionne bien et élégamment, avec quelques configurations. Néanmoins, je ne comprends toujours pas pourquoi c'est arrivé. Tout ce que je sais, c'est que les 3 lignes suivantes apparaissent lorsque je le déploiement de l'application dans JBoss 4.2.3. D'autre part, ils n'apparaissent pas dans WebSphere:
et
Je n'ai toujours pas la moindre idée de pourquoi cela se produit, puisque, comme @Dreamer dit, ce doit être une source de responsabilité, et donc, de WebSphere business.
Si quelqu'un ne avoir une telle idée, merci de nous éclairer. Je suis sûr que cela serait merveilleusement la clarification de tous les participants à cette discussion.
D'accord avec duffymo, il devrait fonctionner sur WS 7. Alors que le Printemps est sur le dessus de Websphere afin de Printemps de l'annotation est de webshere d'affaires(en quelque sorte).
Une chose que vous avez probablement besoin de vérifier sur WS 7(même si vous avez dit que chaque configuration est correcte car il fonctionne sur JBoss) est sur votre application -> cliquez sur
Class loading and update detection
, assurez-vous que leClasses loaded with local class loader first (parent last)
est cochée. Que ferait le serveur pour prendre votre bibliothèque d'application viennent en premier, suivis par websphere bibliothèque.