Cannot find CDI beans



我创建了这个简单的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。你能告诉我我错过了什么吗?我不想在faces-config.xml中声明bean。

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

你需要使用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
    {
    .......
    }

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

除此之外,即使找到了bean,您仍然可能在作用域方面遇到问题;您不能将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()来启动"对话"(视域)和"结束"对话(就像JSF通过销毁视域bean所做的那样)。这是设计和环境的问题。至少,您可以在@PostConstructor中调用conversation.begin()。在哪里结束会话取决于您的具体用例

相关内容

  • 没有找到相关文章

最新更新