JaxWS: веб-сервис с базовой аутентификацией - PullRequest
2 голосов
/ 15 февраля 2012

Я создаю клиент для веб-службы SOAP. Я автоматически сгенерировал большую часть клиентского кода с помощью IntelliJ IDEA, сказав, что он должен создать клиент веб-службы JaxWS из WSDL.

Веб-служба работает по разным 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 локально и указать на него URL-адрес file://. Но это не соответствует моим требованиям, поскольку расположение службы, определенное в файле WSDL, различается, и я не могу изменить URL службы в объекте service, который был загружен из файла WSDL.

У кого-нибудь есть решение для получения файла WSDL с базовой аутентификацией?

1 Ответ

1 голос
/ 30 марта 2012

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

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

в requestContext и убедитесь, что вы не получите доступ к defaultConstructor.

...