Почемуне разрешить Spring Beans в пакете фрагментов OSGi? - PullRequest
3 голосов
/ 30 марта 2012

Я создаю приложение Spring 3, JSF 2, OSGi (Virgo Tomcat 3.5.0.M03).

В настоящее время у меня есть веб-пакет узла и пакет фрагментов. Фрагмент пакета добавляет некоторые .xhtml JSF-страницы (facelets) к хосту. Страницы JSF во фрагменте имеют свои собственные контроллеры пользовательского интерфейса (бины Spring, связанные с commandButton с помощью атрибута action).

Я настроил Spring bean-компоненты, используя <context:component-scan base-package="my.scan.package" /> в наборе моего хоста (веб-приложения) applicationContext.xml.

Теперь, хотя context:component-scan работает для комплекта хоста (т. Е. Обнаруживаются бины Spring, выступающие в качестве контроллеров пользовательского интерфейса), в случае комплекта фрагмента происходит сбой:

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)

Итак, хотя предполагается, что фрагмент является частью того же пути к классам, что и его хост, и класс контроллера пользовательского интерфейса объявлен во фрагменте следующим образом:

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

...
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

Выдержка из фрагмента MANIFEST.MF:

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

Как мне получить JSF для разрешения бинов Spring во фрагменте? Любые указатели приветствуются. Спасибо.

лица-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>

1 Ответ

0 голосов
/ 02 апреля 2012

Хорошо, я нашел ответ. Контекст Spring создается при запуске приложения, поэтому добавление фрагмента с компонентами Spring не обновляет контекст автоматически. Похоже, что подпрыгивание контейнера (Virgo) решает проблему - аннотированные bean-компоненты во фрагменте становятся частью объединенного контекста фрагмента хоста.

Дело в том, что я ожидал, что это произойдет при развертывании фрагмента, поскольку Дева в любом случае обновляет (останавливает и перезапускает) хост-пакет при развертывании фрагмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...