Передача атрибута заголовка в запрос WS - JAX RS - PullRequest
2 голосов
/ 13 апреля 2020

Я пытаюсь подключиться к WS, который требует от меня указать указанное c имя хоста во время подключения. Я пытаюсь добиться этого, используя JAX-WS и Apache CXF, но до сих пор мне не удалось.

Я могу получить доступ к конечной точке, используя CURL

curl -v -H 'Host: myHost' http://.../endpoint.jws?wsdl

Проблема здесь в том, что мне нужно предоставлять параметр host всякий раз, когда я пытаюсь получить доступ к WSDL.

Это то, что я пробовал до сих пор:

final URL wsdlLocation = URI.create("http://.../endpoint.jws?wsdl").toURL();
log.info("URL : {}", wsdlLocation.toString());

HttpURLConnection cnx = (HttpURLConnection) wsdlLocation.openConnection();
cnx.setRequestProperty("Host", "myHost");

PNMService pnmService = new PNMService(wsdlLocation);
pnmPortType = pnmService.getPNMPort();

И PNMService класс:

@WebServiceClient(name = "PNMService", targetNamespace = "http://www.myhost.com/pnm/service", wsdlLocation = "${pnm.wsdl.url}")
public class PNMService extends Service {

    private static final QName PNMSERVICE_QNAME = new QName("http://www.myhost.com/pnm/service", "PNMService");

    PNMService (URL wsdlLocation) {
        super(wsdlLocation, PNMSERVICE_QNAME);
    }

    /**
     * @return returns PNMPortType
     */
    @WebEndpoint(name = "PNMPort")
    PNMPortType getPNMPort () {
        return super.getPort(new QName("http://www.myhost.com/pnm/service", "PNMPort"), PNMPortType.class);
    }

}

И каждый раз, когда ошибка одинакова:

Caused by: java.io.IOException: Server returned HTTP response code: 503 for URL: http://.../endpoint.jws?wsdl

Один и тот же URL-адрес доступен командой CURL (и без имени хоста CURL также выдает мне ту же ошибку 503.)

Я перепробовал все, что описано во всех этих вопросах (включая подход к системным свойствам):

И, как показывают комментарии в этих ответах, у меня в помпе cxf-rt-frontend-jaxrs cxf-rt-frontend-jaxws и cxf-rt-transports-http, и я вижу, как вызывается CXF

org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.

Но пока мне не повезло. Может кто-нибудь, пожалуйста, помогите мне понять, что я делаю здесь не так?

1 Ответ

0 голосов
/ 21 апреля 2020

Я наконец заработал, и решение проблемы простое.

Создание PNMServie (то есть WebServiceClient) также пытается установить соединение с WS. Это неизбежно приведет к сбою из-за моих ограничений на заголовки.

Так что все, что мне нужно было сделать, это создать WebServiceClient без попытки подключения, пока я не смогу установить заголовки.

JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();
bean.setServiceClass(PNMPortType.class);
bean.setAddress(wsdlUrl);
bean.setServiceName(new QName("http://.../service", "MyService"));

pnmPortType = (PNMPortType) bean.create();

Map<String, Object> requestHeaders = new HashMap<>();
requestHeaders.put("host", Collections.singletonList("MyHostHeader"));

BindingProvider bindingProvider = (BindingProvider) pnmPortType;
bindingProvider.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
bindingProvider.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
bindingProvider.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);

В Кроме того, свойство ограниченных заголовков должно быть установлено, как описано в этом ответе здесь: { ссылка }

...