2012-11-20 51 views
1

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

 
########## 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";  
     } 

的服务豆

 

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

回答

1

如果你看到你的配置@component是一个春天annoatation。并且您在faces-config.xml中设置ProjectEntityHandlerBean。所以,首先你的ProjectEntityHandlerBean被实例化为JSF ManagedBean。

所以,你必须@ManagedProperty<managed-property>注入你的服务类为JSF托管bean像this.In这种特定情况下是你在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 annoatation.If要注入一个Spring bean为JSF托管Bean或一个JSF ManagedBean到另一个JSF ManagedBean你,如果你正在使用JSF使用@ManagedProperty又一春豆2.0或更高版本或<managed-propety>为jsf 1.2版本。

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”,但我不能真正找到一种更新我原来的问题的方法。

+0

您可以点击您的问题下的“编辑”并更新答案。无论如何,我提到''@ ManagedPropery'只与JSF 2.0原因一致,从JSF 2.0开始,sun实现了annoatations。较小版本不支持annoatations。因此,您必须在'faces-config.xml'中指定它们。更重要的是,如果您在'faces-config.xml'中创建了bean,并使用'@ ManagedBean'at注释了相同的bean类层次,容器只考虑xml文件中的定义。如果你在'faces-config.xml'中定义,并且如果你执行'@ ManagedPropery'来注入另一个bean,那么你将得到Null指针异常。你应该小心。 – SRy