JAX-WS - 如何配置完成URL

JAX-WS - how to configure complete URL

我有一个 Java class,它有一个 @WebService 注释并打包在 WAR 中。将 WAR 部署到不同的 JavaEE 6 应用程序服务器时,我希望具有相同的 URL(当然具有不同的主机和端口...)。

默认命名似乎依赖于应用服务器。一些例子:

玻璃鱼:

http://{主机名或 ip}:{端口}/{服务名称}/{端口名称}

JBoss:

http://{hostname or ip}:{port}/{ejb-jar-name}/{service name}/{port name}

WebSphere:

http://{主机名或 ip}:{端口}/{ejb-jar-name}/{服务名称}

为所有服务器供应商配置此功能的最简单方法是什么?

如果您正在创建基于 POJO class 的 Web 服务,那么您只需将 war 文件打包到一个 ear 文件中,并在application.xml 配置文件。 这是一个 application.xml 文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5">
  <display-name>simple-ws-app</display-name>
  <module>
    <web>
      <web-uri>simple-ws-war.war</web-uri>
      <context-root>/simple-ws-app</context-root>
    </web>
  </module>
  <library-directory>lib</library-directory>
</application>

在注解@WebService 中,您可以配置预期的Web 服务配置,如果您有wsdl 文件,则更容易定义Web 服务。这里是一个完整的@WebService注解配置的例子,只使用你需要的属性。

@WebService(name = "SimpleService",
        serviceName = "SimpleService",
        portName = "SimpleServicePort",
        endpointInterface = "simple.ws.srv.SimpleServicePortType",
        targetNamespace = "http://www.ws.simple/srv",
        wsdlLocation = "WEB-INF/wsdl/simple-ws.wsdl"
)

请注意,如果您使用的是 wsdl 文件,则默认的放置位置是 WEB-INF/wsdl。

现在,此配置的预期 wsdl URL 是

http://hostname:port/simple-ws-app/SimpleService?wsdl

这可能不适用于所有应用程序服务器,我知道它适用于 Glassfish、WildFly 和 Weblogic。

最后,企业 Web 服务的默认命名(例如 EJB WebServices、ear 文件中的 ejb-jar)确实依赖于应用程序服务器。几个月来,我一直在谷歌上搜索并尝试完成此配置,但结果相同。无论您是否提供完整的 @WebService 注释配置,包括具有预期端点配置的有效 wsdl,应用程序服务器都会覆盖 wsdl 端点 URL.