Создание клиента веб-сервиса с известным, но недоступным wsdl - PullRequest
7 голосов
/ 20 января 2010

Компания, с которой мы работаем по электронной почте, получила схему wsdl и xsd.Доступ к веб-сервисам, с которыми мы взаимодействуем, осуществляется через туннель IPsec.В опубликованном WSDL есть локальные ссылки (на их конце), что означает, что мы не можем его использовать.

1-й вопрос: это обычная установка?Я думал, что смысл наличия WSDL заключается не только в том, чтобы определить контракт, но и в том, чтобы предоставить услугу потребителям.

Я могу легко сгенерировать клиент-серверный код из предоставленного WSDL, используя wsimport, wsconsume и т. Д.Я знаю, когда мой сгенерированный клиент звонит моему сгенерированному сервису, он выдает правильное сообщение, которое мне нужно.

2-й вопрос: есть ли простой способ направить это на другой мыльный адрес?

Я просто хочу иметь возможность сделать что-то вроде:

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

Но не использовать мыльный адрес, определенный в WSDL.Я бы не хотел писать кучу клиентов для каждого метода.

Я что-то упустил?

* В ответ на 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 ]

5 голосов
/ 20 января 2010

Я думал, что смысл иметь WSDL было не только определить контракт но также подвергать службу потребители.

Нет, WSDL - чисто описательный инструмент, у него нет реальной роли во время выполнения. Веб-сервис работает полностью независимо от WSDL. Нередко WSDL не выставляется.

Есть ли простой способ направить это в другой адрес мыла?

Это полностью зависит от того, какую реализацию веб-службы вы используете, и вы не говорите, хотя я предполагаю, что JAX-WS. Если это так, то артефакты, сгенерированные инструментами JAX-WS, позволяют, я думаю, передать URL конструкторам-заглушкам клиента.

3 голосов
/ 20 января 2010

Итак, я понял, почему у меня возникла проблема.Я предполагал, что wsdlLocation должен быть WSDL, который публиковал реальный сервис.Это, конечно, не так.Решение состоит в том, чтобы упаковать локальный WSDL с правильным адресом SOAP: для фактической службы в клиент.

edit Я обнаружил, что вы можете программно изменять адрес конечной точки без необходимости изменятьфактический 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!");

Кредит идет на: Цзяньмин Ли

...