找不到CDI bean

时间:2013-03-13 21:45:57

标签: jsf jsf-2 cdi

我创建了这个简单的CDI bean:

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;


    @Named("DashboardController")
    @ViewScoped
    public class Dashboard implements Serializable
    {
    .......
    }

我从faces-config.xml中删除了所有配置。我将这个beans.xml文件创建到WEB-INF目录:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

当我打开JSF页面时,无法找到bean。你能告诉我我错过了什么吗?我不想将bean声明为faces-config.xml。

P.S我不知道这是否重要,但这是一个带有CDI bean的WAB包。

2 个答案:

答案 0 :(得分:2)

您需要使用ViewAccessScoped而不是ViewScoped。

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ViewAccessScoped;
//Note the different import
import javax.faces.context.FacesContext;
import javax.inject.Named;


    @Named("dashboardController")
    @ViewAccessScoped
    public class Dashboard implements Serializable
    {
    .......
    }

您还应该使用非大写字母以名称命名。

答案 1 :(得分:0)

您可能需要将faces_config文件添加到WAB的META-INF文件夹中,如in this thread所述

除此之外,即使找到了豆子,你仍然可能会遇到范围问题;您不能将JSF范围应用于CDI bean。 CDI的@ConversationScoped是一种不太方便的替代JSF的@ViewScoped。范围的不便在于您需要注入额外的托管对象,并且您必须自己主动管理范围。使用:

  1. 使用@ConversationScoped

    注释您的bean
    @Named("DashboardController")
    @ConversationScoped
    public class Dashboard implements Serializable
     {
    
     }
    
  2. Conversation对象注入您的bean

    @Inject
    private Conversation conversation;
    
  3. 在此对象上,您需要拨打begin()end()来启动&#34;会话&#34; (a la viewscope)和&#34; end&#34;对话(就像JSF分别通过销毁一个viewcoped bean)。这是设计和背景的问题。至少,您可以在conversation.begin()中致电@PostConstructor。你结束谈话的地方取决于你的具体用例