@Named bean" hello world"在Glassfish上使用@ApplicationScoped(CDI)

时间:2014-10-29 14:21:08

标签: jsf java-ee ejb cdi el

如何从使用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

源代码:

https://github.com/THUFIR/EntAppWeb

1 个答案:

答案 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”是扫描你的课程的。