spring - 集成 JSF 2.1 和 Spring 3.2

标签 spring jsf-2

我想在我的 JSF 应用程序中使用我的 Spring Bean,让 Spring 在我的 JSF 托管 Bean 中注入(inject)我的服务/存储库。

我在互联网上找到了很多解决方案,但唯一有效的就是以下几行代码:

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

albumRepository 是我尝试注入(inject)的 Spring Bean。

问题是这真的很蹩脚,我不想在每堂课、每次注入(inject)中都这样做。我想使用注释,例如“@Inject”。

在 Google 中搜索答案,我发现我应该在 faces-config.xml 中使用以下配置来集成 JSF 和 Spring:

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

然后,我应该能够使用带有注释“@ManagedProperty(value="#{albumRepository}")”的 Spring Bean。我尝试过,但总是收到错误“托管 bean 的属性 albumRepository 不存在”。

再次在 Google 中搜索,我发现我可以使用 Spring 注释来进行注入(inject),我唯一需要的就是在 applicationContext.xml 中注册我的托管 bean 所在的包。我已经做到了,但 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>

最佳答案

在你的 web.xml 中有这样的上下文参数?

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

您还可以在 web.xml 中发送有关 spring 的监听器

关于spring - 集成 JSF 2.1 和 Spring 3.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12514771/

相关文章:

java - Spring boot - 部分更新最佳实践?

javascript - jQuery 和 primefaces 冲突

jquery - richfaces使用ajax向服务器发送数据

java - Spring Boot中的多模块依赖管理问题

java - Spring MVC 中的 session 同步

java - 如何为每个计划方法分配一个 Hibernate session

java - 使用 util :map 时如何指定空键

java - 访问变量 EL 表达式中的嵌套属性

java - 如果我们收到来自提交的错误响应,则提交可能使用 ajax 的 JSF 2 表单的最佳实践

jsf - rowEdit 在 dataTable Primefaces 上过滤行