0

Я создаю клиент для веб-службы 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 с базовой аутентификацией?

+1

Ну, 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). –

+0

Это может быть возможно, но проблема в том, что обходной путь установит глобальное свойство, которое, возможно, будет мешать другим службам, работающим в одной среде. – flyx

+0

Просто запустите ошибку для JAX-WS. Возможно, это лучшее, что вы можете сделать. –

ответ

0

Создайте новый конструктор для своего WebServiceClient и передайте ему имя пользователя, пароль и местоположение конечной точки (которые меняются). После этого поставьте

requestContext.put(BindingProvider.USERNAME_PROPERTY, user); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw); 
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUrl); 

в запросКонтекст и убедитесь, что вы не получите доступ к конструктору по умолчанию.

+3

Как мне получить доступ к requestContext в конструкторе? Не нужно ли мне называть 'super.getPort()' (который, я полагаю, не будет работать, если инициализация завершена)? И если я не буду называть супер-конструктор, не означает ли это, что клиент вообще не загружает файл WSDL? – flyx

Смежные вопросы