我有一个提供 web 服务(SOAP 和 REST)的 EJB 项目在一个容器内运行,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
event 列出了可用的服务以及它们的可用方法和端点/WSDL/Target 命名空间信息。
但是,当尝试通过 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 容器首先启动吗?或者它实际上与起始顺序有什么关系?如何将两者结合在一起?
提前致谢。