私は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>
私は答えを見つけました。 Springコンテキストはアプリケーションの起動時に作成されるため、Spring Beanでフラグメントを追加してもコンテキストは更新されません。コンテナ(Virgo)を跳ね返すことで、問題を解決するように見えます。フラグメント内のアノテーション付きBeanは、統合されたホストフラグメントコンテキストの一部になります。私が唯一、Virgoが展開されたときにホストバンドルをリフレッシュ(停止&再起動)すると、フラグメントの展開時にこのことが起こることを期待していました。 – Nikhil
これを回答として投稿し、正解としてマークしてください。この質問に対する回答を探している他のユーザーは、役に立つと思います! http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions – Gabber
@Gabber:ありがとう。 (ちょうど試して&明らかに私は8時間待たなければならない - まだ評判が悪い:) – Nikhil