2

この質問に関係のない他のライブラリの中でも、Java 6、Spring Framework 3.1.2、Mule-ESB3.3.0で構築されたエンタープライズアプリケーションがあります。

私たちのBeanとサービスはすべて、自動コンポーネントスキャンと依存性注入(EJBなし、サービスBeanのみ)のために、それぞれJSR-330アノテーションで宣言さ@Namedれています。@InjectJBoss 4.2.3(テスト環境)にデプロイすると、すべてが正常に機能します。ただし、WebSphere 7にデプロイすると、JSR-330アノテーションが機能していないように見えます。でマークされたBeanは@Namedまったく検出されません。

すべてが正しく設定されていることを確認できます(JBossで動作しているため)。具体的に<context:component-scan />は、base-package属性が正しく定義され、scope-resolver使用するように属性が正しく構成されていますJsr330ScopeMetadataResolver(これも使用せずに試しました)。

WebSphere 7(7.0.0.23)がそのような種類の注釈をサポートしていない可能性があることを認識しています。私はまだSpringの同等物@Componentでそれをテストしていません。@Autowired残念ながら、Spring Frameworkを内部で使用している場合でも、クラスがSpringに直接依存しないように、JSR330アノテーションを使用したいと考えています。

それでも、WebSphere7がJSR330アノテーションをサポートしていないという明確なステートメントを探すために、丸1日を費やしましたが、これまでのところ何も見つかりませんでした。

<context:component-scan />さらに、ファイル内のディレクティブを介して、Spring Frameworkがすべての作業を実行していると想定しているため、なぜ機能しないのかわかりませんapplication-context.xml

誰かがこの問題に光を当てることができますか?

WebSphere 7でアノテーションを介して依存性注入をアクティブ化する方法はありますか?

JSR 330 @Named/@InjectアノテーションからSpring独自のアノテーションに戻す@Component@Autowired、機能する可能性がありますか?

必死の試みで、Springを拡張ComponentScanBeanDefinitionParserして、WebSphere7でもJSR330アノテーションを検出できるようにすることはできますか?

何も機能しない場合は、最終的にプレーンXML構成にフォールバックします。ただし、XMLで手動で構成するBeanが数百あるため、これは非常に望ましくありません。

4

3 に答える 3

2

WebSphere8は使用するのに正しいバージョンのようです。EE6(WebSphere 7はEE5)をサポートし、EE6にはCDI 1.0(したがって、JSR 299)が含まれています。

以下は、WebSphereバージョン、JSR299とJSR300の間の関係を要約したDeveloperWorksからのスニペットです。

依存性注入は、Java EEの世界に入る前に、さまざまな実装で何度も登場したテクノロジーです。SpringFrameworkとGoogleGuiceライブラリは人気のある実装です。JSR 330では、これらの機能をJ2SEプラットフォームに組み込む試みが行われました。JSR 299は、JSR 330で定義されたAPIを使用し、JavaEEのニーズをサポートする機能を追加した仕様ですIBM WebSphere Application Server V8およびV8.5(非Libertyプロファイル)は、完全に準拠したJava EE 6コンテナーであり、JSR299を実装します。

于 2013-02-05T15:38:41.210 に答える
2

最終的に、SpringFrameworkのコンポーネントスキャン機能とAutowire機能の両方を拡張することで回避策を思いつきました。

まず、コンポーネントスキャナーに包含フィルターを追加して、@Namedアノテーションも検出およびSpringContainerへの登録に適格であると見なされるようにしました。

<context:component-scan base-package="com.mycompany.mysystem">
    <context:include-filter type="annotation" expression="javax.inject.Named" />
</context:component-scan>

続いて、にBean定義を追加しorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcesso‌​r、自動配線の適格性を@Injectアノテーションに拡張しました。

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
    <property name="autowiredAnnotationType" value="javax.inject.Inject" />
</bean>

@Named当初、これはと@Inject注釈を「再アクティブ化」することに関してはうまく機能しました。ただし、autowire候補の解決プロセスでBeanが競合するという問題がまだいくつかありました。これは、SpringとJSR-330のデフォルトの解決プロセスの違いによるものです。ほんの数個の豆だけがそのシナリオに該当したので、これは大きな問題ではありませんでした。それらはすべて、戦略的に配置された@Qualifier注釈を追加することで解決されました。

これで、追加の構成がほとんどなく、すべてが正常にエレガントに機能しています。それにもかかわらず、私はまだこれが起こった理由を理解していません。私が知っているのは、アプリケーションをJBoss 4.2.3にデプロイすると、次の3行が表示されることだけです。一方、WebSphereには表示されません。

INFO  [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] JSR-330 'javax.inject.Named' annotation found and supported for component scanning

DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
INFO  [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] JSR-330 'javax.inject.Inject' annotation found and supported for autowiring

@Dreamerが言ったように、これはSpringの責任であり、したがってWebSphereのビジネスから外れるはずなので、なぜこれが発生するのかについてはまだわかりません。

誰かがそのような手がかりを持っているなら、私たちに教えてください。この議論に参加するすべての人にとって、それは素晴らしく明確になると確信しています。

于 2013-02-06T10:13:46.170 に答える
-1

duffymoに同意すると、WS 7で動作するはずです。SpringはWebsphereの上にあるため、Springアノテーションはwebshereのビジネス(一種)から外れています。

WS 7でチェックする必要があることの1つは(JBossで動作するため、すべての設定が正しいと言っていても)、アプリケーションをクリックし、>をクリックして、チェックさClass loading and update detectionれていることを確認しClasses loaded with local class loader first (parent last)ます。これにより、サーバーがアプリケーションのライブラリを最初に取得し、次にWebsphereのライブラリを取得するようになります。

于 2013-02-05T21:54:07.730 に答える