标签: cdi

Java EE 6:@Inject和Instance <T>

我对@Injectjava ee 6中的注释有疑问:

有什么区别:

@Inject
private TestBean test;

@Inject
private Instance<TestBean> test2;
Run Code Online (Sandbox Code Playgroud)

要参考:

test2.get();
Run Code Online (Sandbox Code Playgroud)

关于Instance的一些信息:http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

也许在get()调用之前它不会创建对象?我只是想知道哪一个更适合jvm内存.我认为direct @Inject会直接创建一个对象的实例,即使它没有被appplication使用...

谢谢 !

dependency-injection ejb javabeans cdi java-ee-6

14
推荐指数
2
解决办法
7613
查看次数

从线程调用bean时,范围类型javax.enterprise.context.RequestScoped没有活动的上下文

使用Weld-SE 2.1.2.Final获取bean并从线程调用它时,我遇到以下异常:

线程"main"中的异常org.jboss.weld.context.ContextNotActiveException:WELD-001303:范围类型javax.enterprise.context.RequestScoped没有活动的上下文

我的bean用@RequestScooped注释.如果我注释@ApplicationScoped然后它工作正常,但我需要保留@RequestScooped.

这是一个复制者:

public static void main(String[] args) throws Exception {
    Weld weld = new Weld();
    WeldContainer container = weld.initialize();
    final MyPojo pojo = container.instance().select(MyPojo.class).get();

    Thread t = new Thread() {
        public void run() {
            System.out.println(pojo.ping());   // This call fails
        }
    };
    t.start();
    t.join();
    System.out.println(pojo.ping()); // This call succeed
    weld.shutdown();

}

@RequestScoped
public class MyPojo {
 public String ping() {
    return "pong";
 }
}
Run Code Online (Sandbox Code Playgroud)

你遇到过这种行为吗?有什么想让这个工作好吗?

java multithreading cdi weld-se

14
推荐指数
1
解决办法
2万
查看次数

对于带有限定符@Default的类型X的不满意依赖项

我正在尝试Greeter在Wildfly 8.2内部运行的EJB上注入给定类型()的对象.但是,部署始终会失败并显示消息

Unsatisfied dependencies for type Greeter with qualifiers @Default
Run Code Online (Sandbox Code Playgroud)

我试图用注释GreeterImpl和注入点注释,@Default但这也没有用.我在这里错过了什么吗?

我的Greeter界面:

public interface Greeter {
    public void sayHi();
}
Run Code Online (Sandbox Code Playgroud)

我的GreeterImpl班级(唯一实施的班级Greeter):

public class GreeterImpl implements Greeter {
    private static final Logger LOGGER = LoggerFactory.getLogger(GreeterImpl.class);

    @Override
    public void sayHi() {
        LOGGER.info("Hi!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的ScheduledGreeterEJB:

@Stateless
public class ScheduledGreeter {
    @Inject
    private Greeter greeter;

    @Schedule(second = "*/15", minute = "*", hour = "*")
    public void sayHi() {
        greeter.sayHi(); …
Run Code Online (Sandbox Code Playgroud)

code-injection java-ee cdi

14
推荐指数
1
解决办法
3万
查看次数

Java EE 6 CDI事件是事务性的吗?

Java EE 6 CDI事件是事务性的吗?

如果我在事务中触发事件,然后回滚事务,那么事件侦听器的效果是否也会回滚?

此行为是否依赖于支持事务的事件侦听器本身?

如果我尝试从事件监听器内部回滚异常,那么它是否回滚触发事件的事务?

transactions cdi java-ee-6

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

JBoss Weld + java.lang.OutOfMemoryError:PermGen空间

我刚刚切换到Weld来使用CDI JSF 2 Beans +会话范围.

这是我的maven依赖:

    <dependency>
        <groupId>org.jboss.weld.servlet</groupId>
        <artifactId>weld-servlet</artifactId>
        <version>1.0.1-Final</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

这是我的web.xml中的条目:

<listener>
  <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

我立即注意到的一件事是我只需要重新加载我的tomcat 7 2次,java.lang.OutOfMemoryError: PermGen space并将显示在catalina.out日志文件中.

在使用Weld之前,我可以在不使用java.lang.OutOfMemoryError的情况下安全地重新加载我的tomcat 7超过10次.我认为在catalina.sh中增加我的Xmx选项会有所帮助,但这并不符合我的经验.JAVA_OPTS=-Xmx1024m

这是正常的吗?

java jsf cdi jsf-2 jboss-weld

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

CDI中的上下文和范围之间的区别 - 以及Java

在学习JSR-299之后,我阅读了Weld参考文献的第5.1节,其中解释了范围在CDI中的工作原理.显然,语境是与范围密切相关的概念.我已经理解了每一个是什么,但在我的脑海里并没有非常清楚地分开,我甚至想要交替使用这些词.

范围和背景有什么区别?这两个概念之间有什么关系?

我希望CDI领域有一个答案,但我对一般的Java有疑问,因为这些概念也用于其他环境.实际上,在CDI,Java 一般情况下解释概念的答案会得到更多的积分 - 如果我能给他们的话.

java scope cdi

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

什么是CDI的InjectionPoint的Spring DI等价物?

我想创建一个Spring的bean生成器方法,它知道是谁调用了它,所以我开始使用以下代码:

@Configuration
public class LoggerProvider {

    @Bean
    @Scope("prototype")
    public Logger produceLogger() {
        // get known WHAT bean/component invoked this producer 
        Class<?> clazz = ...

        return LoggerFactory.getLogger(clazz);
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到这些信息想要得到这个bean注入?

我正在寻找一些在Spring世界中相当于CDI的东西InjectionPoint.

spring dependency-injection producer cdi java-ee-6

13
推荐指数
2
解决办法
3663
查看次数

以单例模式使用CDI

我试图在一个按照单例方法实现的类中注入一个logger对象.

代码几乎看起来像这样:

Logger 类:

public class LoggerFactory {
    @Produces 
    public Logger getLogger(InjectionPoint caller){
        return Logger.getLogger(caller.getMember().getDeclaringClass().getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建一个需要logger并实现Singleton模式的类:

public class MySingleton{
    @Inject
    private Logger logger;

    private MySingleton instance;

    /*
     * Private constructor for singleton implementation
     */
    private MySingleton(){
        logger.info("Creating one and only one instance here!");
    }

    public MySingleton getInstance(){

        if(instance == null) {
            instance = new MySingleton();
        }

        return instance;
    }
Run Code Online (Sandbox Code Playgroud)

}

如果我运行代码(在Glassfish 3.1.2.2上),我会在尝试使用记录器时立即获得NPE.我做错了什么(beans.xml档案到位)?我也尝试使用@Injectsetter方法为Logger对象,但没有运气.

java singleton dependency-injection cdi

13
推荐指数
1
解决办法
2万
查看次数

wildfly:从配置目录中读取属性

我正在尝试从我的wildfly配置文件夹中的属性文件中读取部署特定信息.我试过这个:

@Singleton
@Startup
public class DeploymentConfiguration {

  protected Properties props;

  @PostConstruct
  public void readConfig() {

    props = new Properties();
    try {
      props.load(getClass().getClassLoader().getResourceAsStream("my.properties"));
    } catch (IOException e) {
      // ... whatever
    }
  }
Run Code Online (Sandbox Code Playgroud)

但显然这不起作用,因为配置文件夹不再在类路径中.现在我找不到一个简单的方法来做到这一点.我最喜欢的是这样的:

@InjectProperties("my.properties")
protected Properties props;
Run Code Online (Sandbox Code Playgroud)

到目前为止,我在网上找到的唯一解决方案是制作我自己的OSGi模块,但我相信必须有一种更简单的方法(没有OSGi!).谁能告诉我怎么样?

java jboss java-ee cdi wildfly

13
推荐指数
3
解决办法
5万
查看次数

IDEA错误"托管bean必须是具体类,或者使用@Decorator注释"

在我的Java EE项目中,我有一些抽象类.IntelliJ IDEA强调它们是红色并告诉我:

托管bean必须是具体类,或者使用@Decorator注释

如果顶级Java类被任何其他Java EE规范定义为托管bean,或者满足以下所有条件,则它是托管bean:

  • 它不是一个非静态的内部类.
  • 它是一个具体的类,或者注释为@Decorator.
  • 它没有使用EJB组件定义注释或在ejb-jar.xml中声明为EJB bean类.
  • 它有一个合适的构造函数 - 或者:
    • 该类有一个没有参数的构造函数,或者
    • 该类声明一个注释为@Inject的构造函数.

我只想使用抽象类,没有任何注释.虽然IntelliJ告诉我这是一个错误,但我的JBoss服务器并没有抱怨它.

任何解释?

abstract-class intellij-idea java-ee cdi

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