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

时间:2018-10-13 09:11:35

标签: java java-ee static ejb

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

要读取init参数,我想使用激发的Configuration Singleton EJB,但是在部署时(当EE容器初始化我的静态变量时)注入的configuration bean似乎为空。 / p>

这是我的配置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);
    }
}

但是configuration为空:

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

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

1 个答案:

答案 0 :(得分:2)

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

要解决这个问题,我还可以使HeavyObject为单例bean并向其中注入Configuration。像这样:

@Singleton
public class HeavyObject {

    @Inject
    private Configuration conf;

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

}

然后注入:

@Stateless
public class SenderBean {

    @Inject
    private HeavyObject ho;
    ...
}

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

如果有任何用途,也不会阻止您向Configuration注入SenderBean