如何在 EJB 项目中将 SOAP 功能引入 payara/micro



我有一个EJB项目,提供web服务(SOAP和REST),运行在一个容器内,以payara/micro作为基础映像,因为payara/micro没有开箱即用的JAXWS(SOAP支持)功能,但是,通过添加

cxf-rt-frontend-jaxws

cxf-rt-transports-http

作为项目的依赖项,并按照本教程进行操作,并改为放置以下代码:

@Override
public void loadBus(ServletConfig servletConfig) {
super.loadBus(servletConfig);
Bus bus = getBus();
BusFactory.setDefaultBus(bus);
Endpoint.publish("/MySoapService", new ASoapService());
}

我能够使 SOAP 接口几乎可用(wsdl 信息已经公开可用),并且

http://localhost:8080/<my project name>/services

事件列出了可用的服务及其可用的方法和端点/WSDL/目标命名空间信息。

但是,当尝试通过SOAP客户端访问SOAP服务时,我在服务器端出现以下信息行错误:

...
Caused by: java.lang.NullPointerException: null
at com.example.ASoapService.getXxx
...

哪里

ASoapService

实际上是一个 EJB。所以我尝试用以下内容替换上面的代码:

@EJB
ASoapService aSoapService
...
Endpoint.publish("/MySoapService", aSoapService);

在容器启动期间,我得到了

Caused by: javax.naming.NameNotFoundException: com.example.ASoapServiceF#com.example.ASoapService not found

通过检查日志,我发现了一个可能的原因: 当 SOAP 部件使用以下代码启动时

Endpoint.publish("/MySoapService", aSoapService);

EJB 容器尚未准备就绪,因此

查找
ASoapService

失败了,这样的假设正确吗?因为通常你应该看到类似的东西:

[2018-02-02T14:43:57.821+0000] [] [INFO] [AS-EJB-00054] [javax.enterprise.ejb.container] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1517582637821] [levelValue: 800] Portable JNDI names for EJB ASoapService: [java:global/<my project name>/ASoapService, java:global/<my project name>/ASoapService!com.example.ASoapService]

在启动期间,我的情况并非如此。

我对 EJB 和 Glassfish 世界比较陌生,我可以以某种方式强制 EJB 容器先启动吗?还是它实际上与开始序列有关?如何将两者结合在一起?

提前谢谢。

你不应该试图强制 EJB 容器启动。相反,请尝试以下操作之一:

  • 而不是@EJB ASoapService aSoapService注入 EJB 尝试@Inject ASoapService aSoapService-@Inject应该等待依赖项,因此等到 EJB 可用
  • 从 EJB 容器准备就绪后初始化的对象运行方法Endpoint.publish,无论是从启动单例 EJB 还是在初始化 CDI 应用程序作用域时:https://rmannibucau.wordpress.com/2015/03/10/cdi-and-startup/

相关内容

  • 没有找到相关文章

最新更新