2012-03-30 10 views
3

私はSpring 3、JSF 2、OSGi(Virgo Tomcat 3.5.0.M03)アプリケーションを構築しています。なぜ<context:component-scan>はOSGiフラグメントバンドルのSpring Beanを解決しませんか?

現在、私はホストのWebバンドルとフラグメントバンドルを持っています。 フラグメントバンドルは、ホストにJSFページ(フェイスレット)を.xhtml個追加します。フラグメント内のJSFページには、独自のUIコントローラー(アクション属性を使用してcommandButtonにバインドされたSpring Bean)があります。

私はホスト(Webアプリケーション)バンドルのapplicationContext.xml<context:component-scan base-package="my.scan.package" />を使用してSpring Beanを設定しました。

今ホストバンドルのcontext:component-scan作品(UIコントローラとして機能する、すなわちのSpring Beanが発見されている)が、それはフラグメントバンドルの場合に失敗します。

javax.el.PropertyNotFoundException: /flow-deployer-db.xhtml @20,50 action="#{uiControllerDb.deployFlow()}": Target Unreachable, identifier 'uiControllerDb' resolved to null 
    com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:107) 

だから、断片が一部であるように思われるが、そのホストと同じクラスパス、およびUIコントローラクラスのような断片で宣言されている:

package my.scan.package; 
... 
@Component("uiControllerDb") 
public class UIControllerDb implements Serializable { 
(ホストバンドルでの作業中)、それは断片でBeanを解決するために失敗

<h:commandButton id="deployFlow" value="Deploy Flow" type="submit" 
     action="#{uiControllerDb.deployFlow()}" /> 

フラグメントMANIFEST.MFからホストバンドルのMANIFEST.MF

... 
Bundle-SymbolicName: web.host 
Bundle-Version: 4.0.0.alpha 
Require-Bundle: org.glassfish.com.sun.faces 
Import-Package: javax.naming,javax.sql 
Import-Bundle: org.eclipse.virgo.web.dm;version="[3.0.2.RELEASE,4)" 
Import-Library: org.springframework.spring;version="[3.0,3.1.1)" 
Bundle-Name: Web Host bundle 
Web-ContextPath: /webHost 

エキスから抽出:

Bundle-SymbolicName: my.fragment.bundle 
Bundle-Version: 4.0.0.alpha 
Import-Library: org.springframework.spring;version="[3.0,3.1.1)" 
Fragment-Host: web.host;bundle-version=4.0.0.alpha 

は、どのように私はフラグメント内のSpring Beanを解決するためにJSFを得るのですか? すべてのポインタが評価されています。ありがとう。

のfaces-config.xmlに:

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
version="2.0"> 

<application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

</faces-config> 

のweb.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0"> 

<context-param> 
    <param-name>contextClass</param-name> 
    <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value> 
</context-param> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
</servlet-mapping> 

</web-app> 
+0

私は答えを見つけました。 Springコンテキストはアプリケーションの起動時に作成されるため、Spring Beanでフラグメントを追加してもコンテキストは更新されません。コンテナ(Virgo)を跳ね返すことで、問題を解決するように見えます。フラグメント内のアノテーション付きBeanは、統合されたホストフラグメントコンテキストの一部になります。私が唯一、Virgoが展開されたときにホストバンドルをリフレッシュ(停止&再起動)すると、フラグメントの展開時にこのことが起こることを期待していました。 – Nikhil

+1

これを回答として投稿し、正解としてマークしてください。この質問に対する回答を探している他のユーザーは、役に立つと思います! http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions – Gabber

+1

@Gabber:ありがとう。 (ちょうど試して&明らかに私は8時間待たなければならない - まだ評判が悪い:) – Nikhil

答えて

0

[OK]を、私は答えを見つけました。 アプリケーションの起動時にSpringコンテキストが作成されるため、Spring Beanでフラグメントを追加してもコンテキストは自動的に更新されません。 コンテナ(Virgo)をバウンスすると、問題が解決されたように見えます。フラグメント内の注釈付きBeanは、統合されたホストフラグメントコンテキストの一部になります。

フラグメントがデプロイされたときに、Virgoがホストバンドルをリフレッシュ(停止&が再起動)すると、フラグメントのデプロイ時にこれが起こることが予想されました。

関連する問題