我想在我的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>
你試過@Component – Satya
現在我試過,相同的結果=/ –
我不認爲你可以提供一個逗號分隔打包到組件掃描基本軟件包的軟件包列表。 –