Нам предоставила 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"));
}
}
Итак, я выяснил, почему у меня возникла проблема. Я предполагал, что WSDLOCENCE должен был быть WSDL, что фактическое обслуживание было публикации. Это конечно не так. Решение состоит в том, чтобы упаковать локальный 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
Я думал, что точка наличия WSDL было не только определить договор Но также подвергать услугу Потребители.
Нет, WSDL является чисто описательным инструментом, он не имеет реальной роли времени выполнения. Веб-сервис работает полностью независимо от WSDL. Это не редкость для того, чтобы WSDL не быть разоблаченным.
Есть ли простой способ сделать это Различный ямовый адрес?
, который полностью зависит от того, какую реализацию веб-службы вы используете, и вы не говорите, хотя я предполагаю JAX-WS. Если это так, артефакты, которые генерируют инструменты JAX-WS, позволяют проходить в URL-адреса к конструкторам клиента, я думаю.