首页 文章

无法从托管bean实例化Spring Bean,Spring JSF [重复]

提问于
浏览
1

这个问题在这里已有答案:

我创建了一个使用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 回答

  • 1

    如果您看到您的配置 @component 是Spring annoatation . 你正在 faces-config.xml 中设置 ProjectEntityHandlerBean . 所以,首先你的 ProjectEntityHandlerBean get实例化为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>
    

    从上面的 ProjectEntityHandlerBean 删除 @Autowired .

    Important : 你只能使用 @Autowired annoatation将一个Spring Bean注入另一个spring bean . 如果你想将一个Spring Bean注入JSF Managed Bean或一个JSF ManagedBean注入另一个JSF ManagedBean,你使用 @ManagedProperty 如果你使用的是JSF 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”,但我真的找不到更新原始问题的方法 .

相关问题