标签: cdi

比较 CDI 和 AspectJ

我们正在尝试在我们的项目中评估 CDI 和 AspectJ。这里有人做过类似的事情吗?有人可以分享他们对使用 CDI 或 AspectJ 的看法,例如 1. 学习曲线 2. 不同服务器的可移植性 3. 可维护性 4. 调试

谢谢

aop cdi

1
推荐指数
1
解决办法
1584
查看次数

JSF:Bean构造函数在初始加载页面时调用了两次


我正在阅读Java EE 7教程.在第13.12章中,有一个示例应用程序,ajaxguessnumber.我在Glassfish 4中运行示例,一切正常.然后我将System.out.println放在bean构造函数中,我意识到构造函数在初始页面加载期间被调用了两次.为什么会这样,即使是@SessionScoped bean?
这是xhtml文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html lang="en"
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">

    <h:head>
        <h:outputStylesheet library="css" name="default.css"/>
        <title>Ajax Guess Number Facelets Application</title>
    </h:head>
    <h:body>
        <h:form id="AjaxGuess">
            <h:graphicImage value="#{resource['images:wave.med.gif']}"
                            alt="Duke waving his hand"/>
            <h2>
                Hi, my name is Duke. I am thinking of a number from
                #{dukesNumberBean.minimum} to #{dukesNumberBean.maximum}.
                Can you guess it?
            </h2>
            <p>
                <h:inputText 
                    id="userNo" 
                    title="Type a number from 0 to 10:"
                    value="#{userNumberBean.userNumber}">
                    <f:validateLongRange
                        minimum="#{dukesNumberBean.minimum}"
                        maximum="#{dukesNumberBean.maximum}"/>
                </h:inputText>

                <h:commandButton id="submit" value="Submit" >
                    <f:ajax execute="userNo" …
Run Code Online (Sandbox Code Playgroud)

jsf glassfish cdi glassfish-4 java-ee-7

1
推荐指数
1
解决办法
1958
查看次数

记录器,从@Inject 转换为生产者

我有实施类似例如登录接口故障的简单与JSF 2.1 CRUD Web应用程序,PrimeFaces 3.5,EJB 3.1,JPA(ORM)/ EclipseLink的,JAAS中,MySQL 在TomEE的邮件列表,我被告知,我LoginController.java我正在尝试注入 Logger,但 Logger 注入不受 CDI 管理。有人告诉我改用生产者。不知道它是什么,我在互联网上搜索并找到了这个示例 但是我仍然不满意它,所以请解释我必须修改什么才能为记录器实现生产者。

登录控制器.java

package controller;

import util.DateUtility;

import java.io.IOException;
import java.io.Serializable;
import java.security.Principal;
import java.util.logging.Level;
import java.util.logging.Logger;


import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Login Controller class allows only authenticated users to log in to the web
 * application.
 *
 * @author Emre Simtay <emre@simtay.com>
 */
@Named
@SessionScoped

public class LoginController implements Serializable …
Run Code Online (Sandbox Code Playgroud)

jsf jaas cdi apache-tomee jakarta-ee

1
推荐指数
1
解决办法
3888
查看次数

注入和构造函数的CDI顺序

简单的问题,但我无法解决它.据我所知,首先初始化字段,然后调用构造函数.

以下代码

public class Controller {

        @Inject
        private ReadCommand readCommand;

        public Controller() {
            if (readCommand==null){
                System.out.println("NO");
            }else{
                System.out.println("YES");
            }        
        }
}
Run Code Online (Sandbox Code Playgroud)

打印NO.但是当我注入构造函数时

@Inject
public Controller(ReadCommand readCommand)
Run Code Online (Sandbox Code Playgroud)

它打印YES.我究竟做错了什么?

java dependency-injection cdi

1
推荐指数
1
解决办法
1129
查看次数

java在静态方法中注入局部变量

是否可以在java中为静态方法注入局部变量,例如

@Inject
public void someMethod()
{
    @MyInjectQualifier MyObjectClass myobject;
    // use myobject here
}
Run Code Online (Sandbox Code Playgroud)

java inject cdi

1
推荐指数
1
解决办法
1184
查看次数

如果我们将SessionScoped bean注入无状态bean,如果没有HTTP会话会发生什么?

我们的应用程序包含与支持bean和无状态EJB服务交互的Web页面,但也有一个与无状态EJB服务交互的远程客户端.

许多服务查询数据库,然后根据当前用户/调用者过滤结果集(例如,用户只能查看某些记录类型); 也就是说,他们使用程序化而非声明性安全性.

在网络方面,我的直觉是将当前登录的用户存储在SessionBean中,但我希望无状态EJB服务根据当前登录的用户过滤结果集,以便过滤也适用于远程客户端调用.我可以将SessionBean注入无状态EJB服务,但我认为SessionBeans使用HTTP会话,并且因为在远程客户端调用期间没有HTTP会话,所以我看不出它是如何工作的.

我觉得我的方法是错误的,我应该从容器中检索"Principal"; 但是,由于我们的应用程序的开发生命周期,容器管理的安全性尚未设置,但我仍然负责实现负责过滤记录的业务逻辑,而不是以后.

我密切相关的问题:

  1. 是否可以将SessionScoped bean注入无状态EJB,因为知道远程客户端将调用Statelesss EJB?在这种情况下,SessionScoped bean的价值是多少?
  2. 我的支持bean和无状态EJB服务是否应该从容器中检索Principal,而不是SessionScoped bean?
    • 如果是,在设置容器管理的安全性之前,如何替换模拟主体来处理业务逻辑?

ps我是Java EE的新手.

技术:

  • Java EE 6
  • GlassFish 3.1.2.2
  • "支持豆",例如 javax.enterprise.context.SessionScoped
  • "无状态EJB服务",例如 javax.ejb.Stateless
  • "远程客户"; 即一些非Web客户端直接调用无状态bean(通过EJB/RMI)

更新:

有关"远程客户端"的更多详细信息.我不确定如何说这个,因为我是Java EE的新手,但这个"远程客户端"不会通过HTTP.另一个应用程序,我们称之为应用程序X,将从客户端接收XML消息.我认为他们使用证书对客户端进行身份验证.应用程序X将XML转换为POJO并直接调用我的无状态EJB服务.

在这种情况下,我认为我说我不应该SessionBeanStatelessEJB服务注入,因为在应用程序X调用EJB服务时将不会有HTTP会话.我的理解是否正确?

感谢您的耐心等待.我知道我对这些事情的无知.

java architecture ejb java-ee cdi

1
推荐指数
1
解决办法
1596
查看次数

CDI:手动获取用泛型声明的类的 bean 实例

这是我手动获取 cdi bean 实例的方式:

Bean<?> bean = (Bean<?>)beanManager.resolve(beanManager.getBeans(Foo.class));
Foo foo=(Foo) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
Run Code Online (Sandbox Code Playgroud)

如果我这样声明 Foo 类:

@Dependent
public class Foo{
   ...
}
Run Code Online (Sandbox Code Playgroud)

一切正常。但是,如果我这样声明 Foo 类

@Dependent
public class Foo<T>{
   ...
}
Run Code Online (Sandbox Code Playgroud)

cdi 容器无法创建 cdi bean。如何手动获取使用泛型(Foo)声明的类的 cdi bean?

java generics cdi

1
推荐指数
1
解决办法
996
查看次数

CDI 注入 bean 是否需要 getter 和 setter?

当使用 CDI 注入 bean 时:

@Inject Person person;
Run Code Online (Sandbox Code Playgroud)

是否需要/推荐使用 setter 和 getter?

import javax.inject.Inject;
import javax.inject.Named;

@Named
@SessionScoped
public class myJSFBean{

  @Inject Person person;

  public void setPerson (Person person){
    this.person = person;
  }
  public Person getPerson (){
    return person;
  }
Run Code Online (Sandbox Code Playgroud)

我找到了这个文档,但我不明白它的意思:http : //docs.oracle.com/javaee/6/tutorial/doc/gjbbp.html

java dependency-injection inject cdi

1
推荐指数
1
解决办法
1680
查看次数

使用生产者创建应用程序范围的类成员

说在下面的代码中,Hazelcast 实例将是应用程序范围是真的吗?

@ApplicationScoped
public class Producer {

    private HazelcastInstance instance;

    @PostConstruct
    public void afterCreate() {
        instance = Hazelcast.newHazelcastInstance();
    }

    @Produces
    public HazelcastInstance getInstance() {
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

这个解决方案:

  1. 确保生产是应用范围的。
  2. 提供优雅的 Hazelcast 关闭。
@ApplicationScoped
public class Producer {

    private HazelcastInstance instance;

    private Producer() {}

    @PostConstruct
    public void afterCreate() {
        instance = Hazelcast.newHazelcastInstance();
    }

    @PreDestroy
    public void beforeDestroy() {
        if(instance != null) {
            instance.shutdown();
        }
    }

    @Produces
    @ApplicationScoped
    public HazelcastInstance getInstance() {
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

java cdi hazelcast jakarta-ee

1
推荐指数
1
解决办法
2558
查看次数

CDI是否重用RequestScoped的代理?

如果我创建一个带注释的bean,@RequestScoped我希望它会为每个新请求实例化一个新的代理实例.

另一方面,每个请求都与其自己的线程相关联.

我的问题是:如果新请求重用以前从池中创建的线程,CDI会重用以前创建的bean/service的代理对象吗?

java java-ee threadpool proxies cdi

1
推荐指数
1
解决办法
203
查看次数