Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 找不到CDI bean_Jsf_Jsf 2_Cdi - Fatal编程技术网

Jsf 找不到CDI bean

Jsf 找不到CDI bean,jsf,jsf-2,cdi,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

我创建了这个简单的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中删除了所有配置。我在WEB-INF目录中创建了这个beans.xml文件:

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


我不知道这是否重要,但这是一个带有CDIBeans的WAB包。

您需要使用ViewAccessScope而不是ViewScope

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
    {
    .......
    }

您还应该在Named中以非大写字母开头。

您可能需要将faces\u config文件添加到WAB的
META-INF
文件夹中,如前所述

除此之外,即使找到了bean,您也可能在范围界定方面存在问题;不能将JSF作用域应用于CDIBean。 CDI的
@ConversationScoped
是JSF的
@ViewScoped
的一个不太方便的替代方案。作用域的不便之处在于,您需要注入一个额外的托管对象,并且必须自己主动管理作用域。使用:

  • @ConversationScoped

    @Named("DashboardController")
    @ConversationScoped
    public class Dashboard implements Serializable
     {
    
     }
    
  • 对话
    对象注入bean

    @Inject
    private Conversation conversation;
    
  • 在这个对象上,您需要分别调用
    begin()
    end()
    来启动“对话”(一个la viewscope)和“结束”对话(就像JSF通过销毁一个viewscope bean所做的那样)。这是一个设计和背景的问题。至少,您可以在
    @PostConstructor
    中调用
    conversation.begin()
    。在哪里结束对话取决于您的特定用例


  • JSF中的
    javax.faces.bean.ViewScoped
    与CDI中的
    javax.inject.Named
    不兼容。您应该使用普通的CDI或JSF托管bean,而不是两者都使用。从CODI中查看ViewAccessScope,如果您计划使用CDIin以排除其他错误可能性,请将范围更改为SessionScope并再次运行。是的,但据我所知,
    ViewAccessScope
    来自CODI框架,而不是CDI。OP没有使用CODI,你甚至没有在回答中提到这个框架。就这个问题的任何其他旁观者而言,
    ViewAccessScoped
    似乎是cdi的一部分,希望您提供信息。我可以使用以下代码自动释放资源:
    @Remove public void finishIt(){conversation.end();}
    。我想把它放在托管bean的底部,让应用服务器在用户关闭页面时单独管理资源。@PeterPenzov是的,你可以。在EJB中,这是此处推荐的放置itAs@BalusC的最佳位置:新的JSF2.2将解决此问题。我只想换成新版本。@PeterPenzov没关系。不要想2.2。已经正式发布了。链接断了,我的朋友