使用捆绑在 webapp 中并在 Wildfly 上运行的 myfaces 时未调用 CDI Bean 方法

Posted

技术标签:

【中文标题】使用捆绑在 webapp 中并在 Wildfly 上运行的 myfaces 时未调用 CDI Bean 方法【英文标题】:CDI Bean method not called when using myfaces bundled in webapp and run on Wildfly 【发布时间】:2020-09-01 00:35:46 【问题描述】:

我想将我的 JSF 应用程序从 ManagedBean 迁移到 CDI Bean。

首先,我做了一个简单的测试,看看 CDI 是否正常工作,但它们没有。 这是我的示例,使用 Wildfly 10 和 myfaces 2.2

.\WEB-INF 中的beans.xml

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="all">
</beans>

xhtml 页面:

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">

<h:head>
    <title>
        test
    </title>
</h:head>

<h:body>
    <h:outputText value="#CDITest.hello"/>
    <h:outputText value="test"/>
</h:body>

</html>

支持 Bean

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import java.io.Serializable;

  @Named("CDITest")
  @SessionScoped
  public class CDITest implements Serializable

    public String getHello()
      return "Hello";
    

输出

测试

没有错误消息 (!) 并且没有调用 CDITest.getHello() 方法。我错过了什么?

【问题讨论】:

在 JSF 开发模式下运行你的应用程序 你的意思是 javax.faces.PROJECT_STAGE?这是发展 和一个视图源显示? 测试 顺便说一句,wildfly 10 和 myfaces?不是默认组合...您可以尝试启用他们的默认 JSF 吗? 【参考方案1】:

这个问题更普遍。 在 JSF 2.3 中,JSF 通过 BeanManager#getELResolver 获取 CDI。在 JSF 2.3 之前,容器或 CDI impl 必须结合 JSF 和 CDI。

【讨论】:

【参考方案2】:

我认为您需要在 JSF 2.3 中声明一个带 @FacesConfig 注释的类来激活 CDI

import javax.enterprise.context.ApplicationScoped;
import javax.faces.annotation.FacesConfig;

@FacesConfig
@ApplicationScoped
public class ConfigurationBean 


【讨论】:

就像在 *** 的多个副本中提到的那样。 (在最近的版本中不再需要这个 btw)问题是 OP 正在使用 MyFaces 2.2。【参考方案3】:

在 Wildfly 19.0.0 上升级到 myfaces-2.3.6 (jsf 2.3) 解决了这个问题。请注意,您需要 @Cristyan 建议的 @FacesConfig 类。

另请注意,使用 Mojarra 并没有发生此问题,并且 Bean 按预期工作(对于 Widlfly 10 和 Widlfly 19)。

【讨论】:

以上是关于使用捆绑在 webapp 中并在 Wildfly 上运行的 myfaces 时未调用 CDI Bean 方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 wildfly (wildfly:deploy) 在一个简单的 Maven 项目中构建失败

当角靴和弹簧靴捆绑在一次战争中并部署在tomcat上时,是否需要proxy.conf.json文件

在 Wildfly 上设置每个应用程序的属性

Wildfly 8 基本身份验证

Wildfly DuplicateServiceException

使用 webpack 导出和捆绑函数并在 html 脚本标签中调用它