如何从使用CDI的NextClient
bean输出到facelet?
我试图使用CDI导入:
package dur.beans;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
@Named("nextClient")
@ApplicationScoped
public class NextClient implements NextClientLocal {
private int next = 1009;
@Override
public int getNext() {
next = next + 1;
return next;
}
}
使用facelets示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:head></h:head>
<h:body>
This and everything before will be ignored
<ui:composition template="template.xhtml">
<ui:define name="navigation">
<ui:include src="menu.xhtml"/>
</ui:define>
<ui:define name="main">
<h1>bird</h1>
<p>
next #{nextClient.next}
</p>
</ui:define>
</ui:composition>
This and everything after will be ignored
</h:body>
</html>
然而,似乎没有来自bean的任何输出:
thufir@dur:~$
thufir@dur:~$ lynx -dump http://localhost:8080/EntAppWeb-war/next.xhtml birds...
crud ops
__________________________________________________________________
[1]Home
[2]Parrot
[3]Eagle
[4]Falcon
[5]next
bird
next
References
1. http://localhost:8080/EntAppWeb-war/next.xhtml
2. http://localhost:8080/EntAppWeb-war/next.xhtml
3. http://localhost:8080/EntAppWeb-war/next.xhtml
4. http://localhost:8080/EntAppWeb-war/next.xhtml
5. http://localhost:8080/EntAppWeb-war/next.xhtml
thufir@dur:~$
此示例改编自Facelets Essentials;不过,我想使用CDI。
是beans.xml
的问题?有些地方说它是可选的,有些则需要beans.xml
。这似乎是可选的:
23.13配置CDI应用程序
当您的bean使用范围类型进行批注时,服务器会识别 应用程序作为bean归档文件,没有其他配置 需要。 “使用”中列出了CDI bean的可能范围类型 作用域。 CDI使用名为beans.xml的可选部署描述符。 与其他Java EE部署描述符一样,配置设置 除了CDI中的注释设置外,还使用了beans.xml 类。 beans.xml中的设置会覆盖注释设置if 有冲突。存档必须包含beans.xml部署 仅在某些有限的情况下描述...
Java EE 7 教程 Java EE平台版本7 p 404
据我所知,似乎推荐CDI超过@ManagedBean
。我没有找到比这更简单的例子。
另见:
https://stackoverflow.com/a/4397444/262852
https://stackoverflow.com/questions/26110888/what-is-the-alternative-to-managedbean
源代码:
答案 0 :(得分:1)
支持bean是正确的。您需要检查您的服务器是否支持CDI,或者您需要使用一些额外的库来使其工作(例如Apache Tomcat)。
我认为带有CDI的beans.xml是必需的,因为容器需要扫描所有使用CDI注释注释的bean。
<?xml version="1.0" encoding="UTF-8"?>
<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="annotated">
</beans>
这个 bean-discovery-mode =“annotated”是扫描你的课程的。