我正在为我为 Glassfish6 开发的 SOAP API 创建 REST 相邻(即 HTTP 方法实现,但不是实际的 REST 结构)API 包装器。在开发过程中,除了 SOAP 之外,我还为 REST 相邻控制器创建了一个新的模块控制器。 SOAP 控制器使用@WebService 进行注释。最初,该模块是作为 JAR 构建并部署的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.1</version>
<configuration>
<ejbVersion>3.1</ejbVersion>
</configuration>
</plugin>
它现在已构建并部署为 WAR:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>
我能够构建此模块并将其部署到我的 Glassfish6 服务器。但是,存在一个奇怪且不一致的问题,其中,在部署模块 Glassfish6 时,应用程序将报告应用程序具有引擎 ejb、web,而不是 ejb、web、webservices,如下面应用程序控制台屏幕截图中的外部模块所示:SOAP 模块控制器:
@WebService(targetNamespace = "http://redactednamespace.com")
@Stateless
@LoginNotRequired
public class External extends BaseController {
@Override
protected void setModuleNameInRegistry() {
registry.putResource(MODULE_NAME, "External");
}
}
REST 相邻控制器
@Path("external/{serviceName}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Stateless
public class ExternalJson extends BaseJsonController {
@Override
protected void setModuleNameInRegistry() {
registry.putResource(MODULE_NAME, "External");
}
}
由于 Web 服务未处于活动状态,SOAP 控制器在尝试访问时会抛出 404,声称没有端点正在侦听。不过,使用 REST 控制器确实允许访问模块。单独重新部署并不能解决问题。更奇怪的是,几个小时后(没有重新部署,也没有我这边的额外步骤),GF6 将报告该模块是一个 Web 服务引擎,并且可以访问 SOAP 控制器(就像您所看到的那样)在屏幕截图中的核心和后台模块中)。在随后的重新部署中,GF6 不会出现将模块正确部署为 ejb、web、webservices 的问题。显然,选择 SOAP 或 REST 将是最佳选择,但不幸的是,目前还不太可行,因此任何建议都是在这里非常感谢。谢谢!
Glassfish 4.1:耳内战争不公开 Web 服务。
有一个旧的 jaxws-rt 依赖项导致了升级到 jakarta 时未解决的问题。删除依赖关系可以让 Web 服务正常启动。