1

我创建了这个简单的 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。

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

4

2 回答 2

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

您还应该以非大写字母开头 Named 中的名称。

于 2013-03-14T09:45:55.640 回答
0

您可能需要将 faces_config 文件添加到您META-INF的 WAB 文件夹中,如此线程中所述

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

  1. 用注释你的 bean@ConversationScoped

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

    @Inject
    private Conversation conversation;
    
  3. 在这个对象上,您需要分别调用begin()end()开始“对话”(一个视图范围)和“结束”对话(就像 JSF 通过销毁视图范围的 bean 所做的那样)。这是设计和上下文的问题。至少,您可以调用conversation.begin()一个@PostConstructor. 您在哪里结束对话取决于您的具体用例

于 2013-03-15T05:51:40.823 回答