无法从托管bean Spring + JSF实例化Spring Bean

时间:2012-11-20 17:22:37

标签: spring jsf managed-bean

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

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

    @Component
    @Scope("request")
    @Qualifier("memberBean")
    public class ProjectEntityHandlerBean
    {

      private  List projectList;

      @Autowired
      private ProjectBeanLocal projectBean;

    public ProjectEntityHandlerBean()
    {

    }

    public List getProjectList() {  
        return projectList;  
    } 


        public String getAllProjects()
        {       
            projectList = projectBean.getAllProjects();
            return "true";      
        }

服务Bean


    @Service
    public class ProjectBean implements ProjectBeanLocal {

          @PersistenceContext
          private EntityManager em;

        /**
         * Default constructor. 
         */

        public ProjectBean() {
            // TODO Auto-generated constructor stub
        }

        @Transactional
        public List getAllProjects()

        {   
            System.out.println("ProjectBean invoked");

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

            @SuppressWarnings("unchecked")




        List projects = query.getResultList();                 
            return projects;
        }

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>

2 个答案:

答案 0 :(得分:1)

如果您看到您的配置@component是春天的日期。您正在ProjectEntityHandlerBean中设置faces-config.xml。因此,首先将ProjectEntityHandlerBean实例化为JSF ManagedBean。

所以,你必须@ManagedProperty<managed-property>将你的服务类注入到这样的JSF托管bean中。在这种特殊情况下,你在faces-config.xml中定义了你的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-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 annoatation将一个Spring Bean注入另一个Spring bean。如果您想将Spring Bean注入JSF Managed Bean或一个JSF ManagedBean如果您使用的是JSF 2.0或更高版本,则使用@ManagedProperty的另一个JSF ManagedBean;对于jsf 1.2版本,使用<managed-propety>

答案 1 :(得分:0)

Srinivas,thnx的帮助。那有用!!!

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

我改变了你提出的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”,但我真的找不到更新原始问题的方法。