Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 启动bean在调用products后正在加载_Java_Jakarta Ee_Ejb 3.0 - Fatal编程技术网

Java 启动bean在调用products后正在加载

Java 启动bean在调用products后正在加载,java,jakarta-ee,ejb-3.0,Java,Jakarta Ee,Ejb 3.0,我的应用程序中有两个模块,其中第一个模块有一个单例启动bean,我将本地服务绑定为JNDI资源。在第二个模块中,我有一个Producer,我想在其中查找这个资源,但在整个生命周期中遇到了一个问题,因为Producer是在启动Bean之前启动invoke,结果是加载资源失败。这是我的密码: @Slf4j @Singleton @Startup public class WebSocketServerActivator { private static final Logger LOG =

我的应用程序中有两个模块,其中第一个模块有一个单例启动bean,我将本地服务绑定为JNDI资源。在第二个模块中,我有一个Producer,我想在其中查找这个资源,但在整个生命周期中遇到了一个问题,因为Producer是在启动Bean之前启动invoke,结果是加载资源失败。这是我的密码:

@Slf4j
@Singleton
@Startup
public class WebSocketServerActivator {
    private static final Logger LOG = LoggerFactory.getLogger(WebSocketServerActivator.class);

    private void startServer() {
        try {
            WebSocketServer webSocketServer = WebSocketServer.getInstance();
            webSocketServer.setHost("localhost");
            webSocketServer.setPort(9900);
            webSocketServer.initialize();

            InitialContext ic = new InitialContext();
            ic.rebind(WebSocketSQLService.WEBSOCKET_SQL_JNDI, SQLRequestManager.getInstance());

        } catch (Exception e) {
            LOG.error("Error while starting webSocket in start activator ", e);
        }
    }

    @PostConstruct
    public void postConstruct() {
        startServer();
    }

}
以下是其他模块中的生产者类:

public class WebSocketServiceLocator {

    @Produces
    public WebSocketSQLService getWebSocketService(
            @JndiStringResource(value = "visma.websocket.server", defaultValue = WebSocketSQLService.WEBSOCKET_SQL_JNDI)
                    Supplier<String> websocketServerName
    ) {
        return (WebSocketSQLService) lookupService(websocketServerName.get());
    }

    private Object lookupService(String lookupName) {
        try {
            InitialContext ic = new InitialContext();
            return ic.lookup(lookupName);
        } catch (NamingException e) {
            throw new RuntimeException("Cannot find " + lookupName, e);
        }
    }
}
公共类WebSocketServiceLocator{
@产生
公共WebSocketSQLService getWebSocketService(
@JndiStringResource(value=“visma.websocket.server”,defaultValue=WebSocketSQLService.websocket\u SQL\u JNDI)
供应商websocketServerName
) {
return(WebSocketSQLService)lookupService(websocketServerName.get());
}
私有对象lookupService(字符串lookupName){
试一试{
InitialContext ic=新的InitialContext();
返回ic.lookup(lookupName);
}捕获(NamingE例外){
抛出新的RuntimeException(“找不到”+lookupName,e);
}
}
}

有人能告诉我为什么在WebSocketServiceLocator之后加载@startup bean吗?

根据您使用的标签,ejb-3.0还没有提供@startup。 如果您使用的是3.1,那么您可以使用@Startup singleton和@DependsOn来定义bean的顺序。

您知道当两个EJB都位于不同的模块中时,如何应用@DependsOn吗?模块不应该是问题,应该是EJB名称@Singleton(name=“Something”)事实上,它产生了一个问题,我有另外一个Singleton EJB(TestSingleton),它在WebSocketServerActivatorEJB之前激活。我尝试在TestSingleton上使用@DependsOn(“WebSocketServerActivator”),并得到以下错误:java.lang.RuntimeException:EJB TestSingleton的DependsOn依赖项“WebSocketServerActivator”无效。他们都在不同的模块中。我从来没有遇到过这个问题,所以我只能写下,我将如何继续。这是一个“命名问题”吗?在没有DependsOn的部署之后,我会看看名称是什么,这样部署就可以工作了。然后用这个名字。这是一个依赖关系不明确的多模块问题吗?我会尽量避开圆圈来解决这些问题。这是一个常见的多模块问题吗?我会试着证实maven,把一切都放在一个模块中。也许进一步的google/搜索EAR+DependsOn也会有所帮助。将这些EJB组合在同一个模块中可以解决这个问题。谢谢:)