使用 webapp 中捆绑的 myfaces 和 Wildfly 上的 运行 时未调用 CDI Bean 方法
CDI Bean method not called when using myfaces bundled in webapp and run on Wildfly
我想将我的 JSF 应用程序从 ManagedBean 迁移到 CDI Beans。
首先,我做了一个简单的测试,看看 CDI 是否在工作,但他们没有。
这是我的示例,使用 Wildfly 10 和 myfaces 2.2
beans.xml 在.\WEB-INF
<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";
}
}
输出
test
没有错误消息 (!),也没有调用 CDITest.getHello() 方法。我错过了什么?
我认为您需要声明一个带注释的@FacesConfig class 以激活 JSF 2.3 中的 CDI
import javax.enterprise.context.ApplicationScoped;
import javax.faces.annotation.FacesConfig;
@FacesConfig
@ApplicationScoped
public class ConfigurationBean {
}
在 Wildfly 19.0.0 上升级到 myfaces-2.3.6 (jsf 2.3) 解决了这个问题。请注意,您需要 @Cristyan 建议的 @FacesConfig class。
另请注意,使用 Mojarra 时没有发生该问题,Bean 按预期工作(对于 Widlfly 10 和 Widlfly 19)。
这个问题比较普遍。
在 JSF 2.3 中,JSF 通过 BeanManager#getELResolver 获取 CDI。在 JSF 2.3 之前的版本中,容器或 CDI impl 必须结合 JSF 和 CDI。
我想将我的 JSF 应用程序从 ManagedBean 迁移到 CDI Beans。
首先,我做了一个简单的测试,看看 CDI 是否在工作,但他们没有。 这是我的示例,使用 Wildfly 10 和 myfaces 2.2
beans.xml 在.\WEB-INF
<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";
}
}
输出
test
没有错误消息 (!),也没有调用 CDITest.getHello() 方法。我错过了什么?
我认为您需要声明一个带注释的@FacesConfig class 以激活 JSF 2.3 中的 CDI
import javax.enterprise.context.ApplicationScoped;
import javax.faces.annotation.FacesConfig;
@FacesConfig
@ApplicationScoped
public class ConfigurationBean {
}
在 Wildfly 19.0.0 上升级到 myfaces-2.3.6 (jsf 2.3) 解决了这个问题。请注意,您需要 @Cristyan 建议的 @FacesConfig class。
另请注意,使用 Mojarra 时没有发生该问题,Bean 按预期工作(对于 Widlfly 10 和 Widlfly 19)。
这个问题比较普遍。 在 JSF 2.3 中,JSF 通过 BeanManager#getELResolver 获取 CDI。在 JSF 2.3 之前的版本中,容器或 CDI impl 必须结合 JSF 和 CDI。