覆盖Glassfish生成的WSDL服务端点地址

时间:2010-01-26 21:53:03

标签: java web-services configuration glassfish wsgen

我有一个由wsgen通过maven生成的Web服务。当我将服务部署到Glassfish时,它将服务器URL放入WSDL中。我们的Glassfish服务器由Apache代理服务器提供。

这一切意味着什么时候有人访问我们的WSDL并查看服务端点和他们看到的肥皂地址位置

http://app server url/service...

而不是

http://proxy server url/service...

我想我需要对一些项目做一些澄清......

  1. 此终结点地址是否重要?如果端点地址与他们将调用以调用服务的代理服务器的URL不匹配,客户端是否仍然能够运行。这基本上是问题“是WSDL到Web服务,因为接口是对象”。

      

    更新:为了回应第一个问题,“ WSDL到Web服务作为接口是对象”。 WSDL中指定的端点地址并不重要。事实上,在不同于WSDL as described here中指定的端点上调用Web服务操作是相对简单的。

    // Create service and proxy from the generated Service class.
    HelloService service = new HelloService();
    HelloPort proxy = service.getHelloPort();
    
    // Override the endpoint address
    ((BindingProvider)proxy).getRequestContext().put(
            BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
            "http://new/endpointaddress");
    proxy.sayHello("Hello World!");
    

  2. 当我们部署到Glassfish时,会自动生成WSDL。有没有一种简单的方法可以通过应用服务器设置覆盖Glassfish中生成的端点地址。如果是这样,我可以创建一个设置来自动将代理服务器URL放入生成的WSDL中。

  3. 如果1确实很重要,我们不能以2的方式覆盖它,那么它基本上意味着我们需要为开发和生产做单独的构建。这并不“感觉正确”,因为在我看来,部署到另一台服务器时我们唯一需要做的就是将现有(和已测试)的战争从一个环境中丢弃到新服务器上。

2 个答案:

答案 0 :(得分:5)

事实证明,部署服务的Server Name上有一个HTTP Listener参数。您可以从Glassfish管理控制台指定此值,Glassfish将使用此名称而不是请求URL中的主机名。

不幸的是,如果您的应用服务器和代理服务器不使用相同的服务器和代理服务器(我们不使用),则此参数将不允许您覆盖端口或协议(http到https)。

我所做的是write a simple servlet filter我的服务为我处理这个问题。

答案 1 :(得分:4)

我发现了我认为处理这个问题的一种非常简单的方法:在Apache中使用mod_substitute。由于我们这些有这个问题的人已经在使用Apache,并且它内置且简单,我最喜欢这种方法。

我在我的一个Apache conf文件中放了一个与下面类似的块,并找到了欢乐:

<Location />
   AddOutputFilterByType SUBSTITUTE text/xml
   Substitute "s|http://internal:8080/xxx|https://external/xxx|ni"
</Location>