java - 在初始化静态变量期间调用 Singleton EJB

标签 java jakarta-ee static ejb

我有一个线程安全的重资源,我想将其初始化为静态类变量。在初始化该对象期间,我需要从外部属性文件中读取一些“连接”参数。

要读取初始化参数,我想使用令人兴奋的Configuration Singleton EJB,但似乎我注入(inject)的configuration bean在部署时为空(当EE容器初始化时)我的静态变量)。

这是我的配置 EJB:

@Startup
@Singleton
@LocalBean
public class Configuration {

    @Lock(LockType.READ)
    public String getValue(String key) {
        return ...;
    }
}

这就是我想要初始化 HeavyObject 的方式:

@Stateless
public class SenderBean {

    private static HeavyObject something;

    @Inject
    private Configuration configuration;

    public SendNotificationBean()  {
        String host = configuration.getValue("....");
        String port= configuration.getValue("....");

        something = new HeavyObject(host, port);
    }
}

但是配置为空:

Caused By: java.lang.NullPointerException
        at com.aaa.bbb.business.SenderBean.configureProxy(SenderBean.java:187)

也许我需要更改容器初始化 EJB-s 的顺序?

最佳答案

它不会工作,因为容器在注入(inject)任何东西之前调用默认构造函数。为此有一个注释@PostConstruct

为了解决这个问题,我还将 HeavyObject 创建为单例 bean,并在其中注入(inject) Configuration。像这样的东西:

@Singleton
public class HeavyObject {

    @Inject
    private Configuration conf;

    @PostConstruct
    private void configure() {
        // make something with the conf
    }

}

并注入(inject)它:

@Stateless
public class SenderBean {

    @Inject
    private HeavyObject ho;
    ...
}

当然,这只是一种方法,但我建议避免 bean 中的静态内容,并仔细考虑 bean 的职责是什么。 这就是为什么我将 @PostConstruct 配置逻辑放入 HeavyObject 单例,而不是在 SenderBean 上运行它。

没有什么可以阻止您将 Configuration 注入(inject) SenderBean(如果有用途的话)。

关于java - 在初始化静态变量期间调用 Singleton EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52791372/

相关文章:

jsf - javax.ejb.CreateException : Could not create stateless EJB - UserTransaction not allowed for Container managed Transaction beans 异常

spring - 为什么在 Spring Security 中对 'anonymousUser' 进行了身份验证?

hibernate - JPA 创建 @ManyToMany 表名不是由 'type_type' 而是由 'type_varname'

linux - 如何在 Ubuntu 16.04 上的 OVH VPS 中将 DHCP 接口(interface)更改为静态接口(interface)

c - 指向静态字符的 int 指针

带有变量的 Java Xpath

java - 在 Java 中复制字符串

java - 是否可以阻止共享首选项以避免被删除?

java - 你在哪里配置jboss6中的log4j设置

c++ - C++中static的含义