使用已知但无法访问的wsdl创建Web服务客户端

时间:2010-01-19 22:47:58

标签: java web-services jboss wsdl client

我们通过电子邮件与我们合作的公司提供了wsdl和xsd架构。我们正在连接的Web服务是通过IPsec隧道访问的。在已发布的WSDL中有本地引用(在它们的末尾),这意味着我们不能使用它。

第一个问题:这是一个常见的设置吗?我认为拥有WSDL不仅要定义合同,还要将服务公开给消费者。

我可以使用wsimport,wsconsume等轻松生成提供的WSDL的客户端/服务器代码。我知道当我生成的客户端调用我生成的服务时,它会生成我需要的正确消息。

第二个问题:是否有一种简单的方法可以将其路由到不同的肥皂地址?

我只是希望能够做到这样的事情:

SalesTaxService svc = new SalesTaxService();
SalesTax tax = svc.getSalesTaxPort()
tax.getRate("NY");

但是不要使用WSDL中定义的soap地址。我想避免为每种方法编写一堆调度客户端。

我错过了什么吗?

*回应skaffman: 这是生成的。它默认为wsdlLocation作为名称​​耸肩

   @WebServiceClient(name = "SomeService")
   public class SomeService_Service extends Service {

    public SomeService_Service(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);            
    }

    public SomeService_Service(URL wsdlLocation) {
        super(wsdlLocation, new QName("urn:some_service", "SomeService"));   
    }
  }

2 个答案:

答案 0 :(得分:5)

  

我想到了拥有WSDL的重点   不仅要定义合同   但也要将服务暴露给   消费者。

不,WSDL纯粹是一个描述性工具,它没有真正的运行时角色。 Web服务完全独立于WSDL运行。 WSDL没有被曝光的情况并不少见。

  

有没有一种简单的方法可以将其发送给   一个不同的肥皂地址?

这完全取决于您正在使用的Web服务实现,并且您没有说,尽管我猜测JAX-WS。如果是这种情况,我认为JAX-WS工具生成的工件允许您将URL传递给客户端存根构造函数。

答案 1 :(得分:3)

所以我想出了为什么我遇到了问题。我假设wsdlLocation必须是实际服务发布的WSDL。当然情况并非如此。解决方案是使用正确的SOAP:本地WSDL将实际服务的地址打包到客户端。

修改的 我发现您可以以编程方式更改端点地址,而无需更改实际的WSDL:

HelloService service = new HelloService (
  this.getClass().getResource("originalHello.wsdl"),
  new QName("http://example.org/hello", "HelloService "));
HelloPort proxy = service.getHelloPort();

Map<String, Object> ctxt = ((BindingProvider)proxy ).getRequestContext();
ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192);
ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://new/endpointaddress");

proxy.sayHello("Hello World!");

信用证转到:Jianming Li