2012-09-20 102 views
4

我想在我的JSF應用程序中使用我的Spring Bean,讓Spring將我的服務/存儲庫注入到JSF Managed Beans中。集成JSF 2.1和Spring 3.2

我發現了很多在互聯網的解決方案,而只是工作的一個是下面的代碼行:

ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance()); 
albumRepository = (AlbumRepository) ctx.getBean("albumRepository"); 

albumRepository是Spring Bean的我試圖注入。

問題是,這真的很蹩腳,我不想在每個班級爲每次注射做到這一點。我想使用「@Inject」這樣的替代。

搜索在谷歌的答案,我發現我應該使用faces-config.xml中以下配置集成JSF和Spring:

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

然後,我應該能夠使用我的Spring Bean與註釋「@ManagedProperty(value =」#{albumRepository}「)」)。我試過了,但我總是得到錯誤「管理bean的屬性albumRepository不存在」。

在Google中重新搜索我發現我可以使用Spring註釋來注入,我唯一需要註冊的地方是我的託管bean位於applicationContext.xml中。我已經做到了,但Spring忽略了我的註釋(@Inject和@Autowired,我都嘗試過)。

在所有這些失敗後,我試着停止使用JSF註釋(@ManagedBean和@ViewScoped),而是使用了Spring的(@Controller和@Scope)。現在JSF甚至不認識這些bean。

我在做什麼錯?

編輯:我的applicationContext.xml

<context:annotation-config/> 
     <jpa:repositories base-package="com.ae.repository" /> 
     <context:component-scan base-package="com.ae.client.web, com.ae.service" /> 

     <!-- Data Source --> 
     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> 
      <property name="url"><value>jdbc:mysql://localhost:3306/academia</value></property> 
      <property name="username"><value>root</value></property> 
      <property name="password"><value>root</value></property> 
     </bean> 

     <bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="database" value="MYSQL" /> 
      <property name="showSql" value="true" /> 
     </bean> 

     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
      <property name="dataSource" ref="dataSource" /> 
      <property name="jpaVendorAdapter" ref="jpaAdapter" /> 
      <property name="persistenceXmlLocation" value="/META-INF/persistence-web.xml"/> 
     </bean> 

     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
      <property name="entityManagerFactory" ref="entityManagerFactory" /> 
     </bean> 

編輯:我的web.xml

<!-- Spring --> 
    <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> 

    <!-- JSF --> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 

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

    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 

    <context-param> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>server</param-value> 
    </context-param> 

    <welcome-file-list> 
     <welcome-file>faces/index.xhtml</welcome-file> 
    </welcome-file-list> 

    <!-- Primefaces --> 
    <filter> 
     <filter-name>PrimeFaces FileUpload Filter</filter-name> 
     <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>PrimeFaces FileUpload Filter</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 
+0

你試過@Component – Satya

+0

現在我試過,相同的結果=/ –

+0

我不認爲你可以提供一個逗號分隔打包到組件掃描基本軟件包的軟件包列表。 –

回答

1

在web.xml有背景PARAM這樣嗎?在web.xml

+0

謝謝你的回答。在我的web.xml中,我有: ​​contextConfigLocation /WEB-INF/applicationContext.xml 。它按預期工作,它加載應用程序上下文。我不認爲這是問題。無論如何,我編輯了原始問題以包含我的web.xml。 –

+1

你檢查過嗎?存在/ – mstzn

+0

謝謝mstzn,很棒的鏈接!那正是問題所在,我沒有爲我的「albumRepository」設置一個setter,我認爲它像Spring一樣工作,「@inject」就足夠了,但我錯了。我仍然不知道爲什麼Spring註釋不起作用,但JSF的「@ManagedProperty」對我很好。由於評論,我正在標記爲正確的答案。 –

0

如果你想Spring IoC容器管理所有的豆類

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:/*Context.xml</param-value> 
    </context-param> 

也可以發送監聽春天有關的。使用@Component,@Named或javax.annotation.ManagedBean註釋之一,並且可以使用@Autowired或@Inject注入它們。不要忘記爲任何這些人使用Spring的@Scope。

Documentation

如果你想使用JSF IOC容器以及與Spring IoC容器一起,你可以Spring Bean注入到使用@ManagedProperty一個JSF豆。

另請參見:

+1

謝謝你的回答Ravi。我真的很喜歡Spring IOC容器來管理我所有的bean,但我嘗試了所有的東西,但它不起作用。我嘗試了所有可能的註釋。我不知道爲什麼,但我認爲Spring忽略了包含我的JSF Managed Beans(com.ae.client.web)的包。我將使用JSF來管理我的Spring bean,我的問題發生了,因爲我沒有爲注入屬性定義setter,現在我有一個「setAlbumRepository」,它工作正常。 –