当前位置: 首页 > 知识库问答 >
问题:

@Glassfish上带有@ApplicationScoped(CDI)的命名bean“hello world”

艾阳羽
2023-03-14

如何从使用CDI的NextClientbean获得输出到facet?

我正在尝试使用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。

bean的问题。xml?有些地方说它是可选的,而另一些地方说它是bean。xml是必需的。这似乎是可选的:

23.13配置CDI应用程序

当您的bean用作用域类型注释时,服务器会将应用程序识别为bean存档,不需要额外的配置。CDI bean的可能作用域类型列在使用范围中。CDI使用名为beans.xml.的可选部署描述符与其他JavaEE部署描述符一样,beans.xml中的配置设置是CDI类中注释设置之外使用的。如果存在冲突,beans.xml中的设置将重写注释设置。只有在某些有限的情况下,存档才必须包含beans.xml部署描述符...

针对JavaEE平台p404的JavaEE7教程第7版

例如,从我所读到的内容来看,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个答案

司马高明
2023-03-14

支持bean是正确的。您需要检查您的服务器是否支持CDI,或者您需要使用一些额外的库来使其工作(例如CDI)。Apache Tomcat)。

我认为CDIbeans.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-发现-模式="注释"是扫描你的类。

 类似资料:
  • 我有一个用@ApplicationScoped注释的CDIBean。有没有一种方法可以告诉Spring在组件扫描期间拾取它,就像它被@component注释一样?Spring确实理解@Inject注释,那么为什么不@ApplicationScoped呢? 这个想法是,在Spring中使用CDI bean会很方便(至少如果他们只使用普通的依赖注入,而没有像拦截器、装饰器这样花哨的CDI东西...)

  • 我使用CDI注释定义了一个RequestScoped bean,如下所示。我有几个页面使用同一个bean。当我从一页导航到另一页时。bean obj保持不变。即使我更改了会话(使用不同的用户登录)。bean对象没有改变。 根据RequestScope定义,bean实例应该为每个新请求重新创建。我错过了什么? 我正在使用JSF/Primefaces。从create输入的值。导航到详细信息后可以看到x

  • CDI到达以执行类的构造函数。但是,请求字段未初始化(注入)。 我做错了什么?

  • 7.3.1 bean的命名 每个bean都有一个或多个标识符。在承载bean的容器中这些标识符必须是唯一的。一个bean通常只有一个标识符,但如果需要有一个以上的标识符,其他的可以认为是别名。 在基于XML的配置元数据中,使用id和/或name属性来指定bean的标识符。id属性允许您精确地指定一个ID。习惯上,这些命名都是数字和字母('myBean', 'fooService'等),但是也可以包

  • 视图和bean一直在工作,直到我试图修复非标准名称,现在我已经打破了两者之间的连接。奇怪的是,“返回”按钮有正确的链接,但内容就是不显示,也不记录。为什么不执行Detail.get注释()? 我一直在浏览焊接文档,并试图更好地理解@Inject。似乎有一个我也不明白的生命周期问题。如果它不是生命周期,那么我甚至不能推测为什么Detail.get注释()从未在glassfish日志中显示: 值200

  • 我们正在尝试将应用程序从Spring迁移到Quarkus Spring。我们可以根据需要重新编写应用程序逻辑。问题来了,因为我们正在使用共享的spring罐,这是传统的,而且数量很多。大多数spring JAR都使用@Autowired使用依赖项注入,但被注入的相应类没有@Component注释。 将用示例描述问题: 类“MyProject”属于Quarkus应用程序 类OtherLevelOne