Я создаю клиент для веб-службы SOAP. Я автоматически генерировал большую часть клиентского кода с помощью IntelliJ IDEA, сообщая ему о создании клиента веб-службы JaxWS из WSDL.JaxWS: веб-сервис с базовой аутентификацией
Веб-сервис работает на разных URL-адресах (тестирование, интеграция, производство), поэтому мне нужно настроить URL-адрес службы в моем клиенте. Мой код выглядит так:
String urlString = props.getProperty(URL);
service = new RequestMultiTransportService(new URL(urlString),
new QName("http://some.uri.com/",
"RequestMultiTransportService"));
Boolean useBasicAuth = Boolean.parseBoolean(props.getProperty(BASICAUTH));
RequestMultiTransport rmt = service.getRequestMultiTransportPort();
if (useBasicAuth) {
String user = props.getProperty(AUTHUSER);
String pw = props.getProperty(AUTHPW);
Map requestContext = ((BindingProvider)rmt).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, user);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw);
}
ProvisioningResponse response = rmt.send("some", "params", "...");
Как вы можете видеть, для службы может потребоваться базовая аутентификация. И вот в чем проблема: хотя я могу настроить базовую аутентификацию для фактического запроса, я не могу настроить его для загрузки файла WSDL (что происходит в конструкторе RequestMultiTransportService
). RequestMultiTransportService
автогенерируется IDEA, а его конструктор просто называет его супер-конструктор, являющийся одним из javax.xml.ws.Service
.
Так что для веб-службы требуется базовая аутентификация, мой код не работает, поскольку он не предоставляет пользователю/паролю для получения файла WSDL, расположенного по адресу urlString
. Возможное обходное решение, о котором я думал, заключается в том, чтобы локально хранить файл WSDL и указывать на него с адресом file://
. Но это не соответствует моим требованиям, поскольку местоположение службы, определенное в файле WSDL, меняется, и я, похоже, не могу изменить URL-адрес службы в объекте service
, который был загружен из файла WSDL.
У кого-нибудь есть решение для получения файла WSDL с базовой аутентификацией?
Ну, JAX-WS не может этого сделать, это похоже на ошибку (наиболее релевантным, который я смог найти, является [JAX_WS-1] (http://java.net/jira/browse/JAX_WS-1?focusedCommentId= 15246 # action_15246)). Поскольку JAX-WS будет использовать 'URLConnection' в конце дня, возможно, это будет использовать [' Authenticator'] (http://stackoverflow.com/a/496707/267197). –
Это может быть возможно, но проблема в том, что обходной путь установит глобальное свойство, которое, возможно, будет мешать другим службам, работающим в одной среде. – flyx
Просто запустите ошибку для JAX-WS. Возможно, это лучшее, что вы можете сделать. –