我想将我的JSF应用程序从ManagedBean迁移到CDI Bean。
首先,我已经做了一个简单的测试,以查看CDI是否正常工作,但不能正常工作。这是我的示例,使用Wildfly 10和myfaces 2.2
。WEB-INF中的bean.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>
后备豆
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 2.3中,JSF通过BeanManager#getELResolver拾取CDI。在JSF 2.3之前的版本中,容器或CDI impl必须与JSF和CDI结合。
我认为您需要声明一个@FacesConfig注释类,以在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类。