Как мне указать хост и порт при доступе к веб-сервису из сгенерированного JAX-WS кода?
-
19-08-2019 - |
Вопрос
У меня есть WSDL-файл для веб-сервиса.Я использую JAX-WS / wsimport для создания клиентского интерфейса для веб-службы.Я не знаю заранее, на каком хосте будет работать веб-служба, и я могу почти гарантировать, что этого не будет http://localhost:8080.Как мне указать URL-адрес хоста во время выполнения, напримериз аргумента командной строки?
Сгенерированный конструктор MyService(URL wsdlLocation, QName serviceName)
не похоже на то, чего я хочу, но, может быть, так оно и есть?Возможно, один из вариантов Service.getPort(...)
?
Спасибо!
Решение
Конструктор должен нормально работать для ваших нужд, когда вы создаете MyService, передайте ему URL нужного вам WSDL, т.е. http://someurl:someport/service?wsdl.
Другие советы
Если вы посмотрите в сгенерированном источнике рядом с сгенерированным конструктором, вы должны быть в состоянии выяснить, что поместить в него из конструктора по умолчанию, должно выглядеть примерно так:
public OrdersService() {
super(WSDL_LOCATION, new QName("http://namespace.org/order/v1", "OrdersService"));
}
Вы должны быть в состоянии найти определение WSDL_LOCATION в статическом поле дальше в классе.
В вашем сгенерированном коде (например:скажите "HelloWorldWebServiceImplService" ) посмотрите на статический блок вверху, который будет содержать ссылку на URL-адрес WSDL или файл wsdl, который находится в разделе META-INF.
/*
static {
URL url = null;
try {
url = new URL("http://loclahost/HelloWorld/HelloWorldWebServiceImpl?wsdl");
} catch (MalformedURLException e) {
java.util.logging.Logger.getLogger(HelloWorldWebServiceImplService.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "http://loclahost/HelloWorld/HelloWorldWebServiceImpl?wsdl");
}
WSDL_LOCATION = url;
}
*/
Как только вы прокомментируете это, вам также нужно закомментировать конструктор по умолчанию и, само собой разумеется, инициализировать статическое значение WSDL_LOCATION = null;(к нулю) Таким образом, у вас не будет двух конструкторов, как показано ниже.
public final static URL WSDL_LOCATION = null;
public HelloWorldWebServiceImplService(URL wsdlLocation) {
super(wsdlLocation, SERVICE);
}
public HelloWorldWebServiceImplService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
Вызывающий веб-сервис : Теперь при вызове клиента, где вы создаете экземпляр этого объекта, передайте URL веб-сервиса в качестве аргумента, как показано
//You can read mywebserviceURL from property file as String.
String mywebserviceURL = "http://myqamachine.com/HelloWorld/HelloWorldWebServiceImpl?wsdl"
URL WsURL = new URL(mywebserviceURL);
HelloWorldWebServiceImplService webService = new HelloWorldWebServiceImplService(WsURL);
Таким образом, здесь вы можете динамически указывать URL-адрес веб-сервиса.