Java Web服务 - 定义服务器位置

时间:2011-06-07 21:18:41

标签: java web-services annotations

我有一个最后的障碍来克服我正在使用的Web服务应用程序;我需要能够覆盖用于在生成的WSDL文件中设置架构位置和soap地址位置的默认设置。

当我部署应用程序(Red Hat Linux上的GlassFish v2.1)时,它使用URL中的本地服务器名称,但它需要使用公共域名。我能够在本地保存WSDL文件,更改URL,将其公开,从文件外部生成测试应用程序,最后能够成功运行测试。

我现在已经进入了JAX-WS自定义绑定的领域,但是我希望我要么忽略了一个更简单的解决方案,要么绑定并不像他们第一眼看到那么复杂。 Web服务实现是通过无状态EJB(例如下面的MyWS.java)实现的。生成的WSDL文件看起来像MyWSDL.wsdl(见下文)。

在xsd:import标签中,我需要将schemaLocation更改为

    http://test.mycompany.com/MyWSService/MyWS?xsd=1 

而不是

    http://local-server-name/MyWSService/MyWS?xsd=1 

并在soap:地址标签中我需要将位置更改为

    http://test.mycompany.com/MyWSService/MyWS 

而不是

    http://local-server-name/MyWSService/MyWS.

MyWS.java

@WebService(name="MyWS",
        portName="MyWSPort",
        serviceName="MyWSService",
        targetNamespace="http://test.mycompany.com/")
@Stateless()
public class MyWS {

    @WebMethod(operationName="testLogin")
    public String testLogin(@WebParam(name="username") String username,
            @WebParam(name="password") String password) {
        String retVal = "Test Failed.";

        //do some stuff

        return retVal;
    }

    ...
}

MyWSDL.wsdl

<definitions targetNamespace="http://test.mycompany.com/" name="MyWSService">

  <types>
    <xsd:schema>
      <xsd:import namespace="http://test.mycompany.com/" schemaLocation="http://local-server-name/MyWSService/MyWS?xsd=1"/>
    </xsd:schema>
  </types>

  <service name="MyWSService">
    <port name="MyWSPort" binding="tns:MyWSPortBinding">
      <soap:address location="http://local-server-name/MyWSService/MyWS"/>
    </port>
  </service>
</definitions>

2 个答案:

答案 0 :(得分:2)

我能够通过更改GlassFish HTTP服务的配置来解决此问题。我将服务器的别名设置为test.mycompany.com:80,以获取用于Web服务应用程序的HTTP侦听器。通常我们在Web服务器中有这种配置,所以最初我甚至没有考虑应用服务器配置。

答案 1 :(得分:0)

您是如何生成WSDL的?你手动生成它吗?你使用wsgen和-wsdl选项生成它吗?

如果您使用JAX-WS进行部署,则实际上不应该执行其中任何一项操作。相反,你应该能够去...

<SERVER_URL>/<CONTEXT_LOCATION>/<SERVLET_URL>?wsdl

...并且JAX-WS servlet将自动生成具有正确位置的wsdl。