1

我创建了一个使用 JSF 和托管 bean 的简单应用程序。我试图从托管 bean 实例化一个将数据存储到数据库的 spring bean。但是“@Autowired”注释似乎不起作用,因为我得到了一个 nullPointerExcpetion。我阅读了有关如何使用 JSF 和 Spring 托管 bean 的所有相关主题,但无法解决问题。也许有人可以看看下面的代码并给我一个提示?

########## ManagedBean #########

    @零件
    @Scope("请求")
    @Qualifier("memberBean")
    公共类 ProjectEntityHandlerBean
    {

      私有列表项目列表;

      @自动连线
      私人项目豆本地项目豆;

    公共 ProjectEntityHandlerBean()
    {

    }

    公共列表 getProjectList() {  
        返回项目列表;  
    }


        公共字符串 getAllProjects()
        {       
            projectList = projectBean.getAllProjects();
            返回“真”;      
        }

服务 Bean

    @服务
    公共类 ProjectBean 实现 ProjectBeanLocal {

          @PersistenceContext
          私人 EntityManager em;

        /**
         * 默认构造函数。
         */

        公共项目Bean(){
            // TODO 自动生成的构造函数存根
        }

        @Transactional
        公共列表 getAllProjects()

        {   
            System.out.println("ProjectBean 调用");

            查询 query = em.createQuery("SELECT p FROM Project p");

            @SuppressWarnings("未选中")




        列出项目 = query.getResultList();                 
            返回项目;
        }

faces.config.xml

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

    <managed-bean>
        <managed-bean-name>loginBean</managed-bean-name>
        <managed-bean-class>com.example.controller.LoginBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

    <managed-bean>
        <managed-bean-name>ProjectEntityHandlerBean</managed-bean-name>
        <managed-bean-class>com.example.controller.ProjectEntityHandlerBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
4

2 回答 2

1

如果您看到您的配置@component是 Spring 注释。而你ProjectEntityHandlerBeanfaces-config.xml. 因此,首先将您ProjectEntityHandlerBean实例化为 JSF ManagedBean。

因此,您必须像这样将您的服务@ManagedProperty<managed-property>注入到 JSF 托管 bean 中。在这种特定情况下,您将 bean 定义faces-config.xml为像这样注入。

<managed-bean>
  <managed-bean-name>ProjectEntityHandlerBean</managed-bean-name>
  <managed-bean-class>com.example.controller.ProjectEntityHandlerBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
   <property-name>ProjectBeanLocal</property-name>
   <property-class>Qualified path for this class</property-class>
   <value>#{projectBeanLocal}</value>
  </managed-property>
 </managed-bean>

去掉@Autowired上面的ProjectEntityHandlerBean

Important :您只能使用@Autowired注解将一个 Spring Bean 注入另一个 Spring Bean。如果您想将一个 Spring Bean 注入 JSF Managed Bean 或将一个 JSF ManagedBean 注入另一个 JSF ManagedBean,@ManagedProperty如果您使用的是 JSF 2.0 或更高版本或<managed-propety>jsf 1.2 版本,则可以使用.

于 2012-11-20T18:59:32.600 回答
0

Srinivas,谢谢你的帮助。那行得通!

所以我所做的是:我删除了@Autowireand

我按照您的建议更改了 faces-config.xml,但略有不同:

<property-name>projectBean</property-name>
<property-class>Qualified path for this class</property-class>
<value>#{projectBean}</value>

我需要提一下我正在使用 JSF2.0。我使用<managed-property>了 @ManagedProperty。仍然可以正常工作。这是我应该担心的事情吗?我这么说是因为你提到 JSF2.0 或更高版本我应该使用 @ManagedProperty

PS:很抱歉我将其发布为“asnwer”,但我真的找不到更新我原来的问题的方法。

于 2012-11-21T09:32:48.063 回答