将标头属性传递给WS请求-JAX RS

问题描述 投票:2回答:1

我正在尝试连接到要求我在连接期间传递特定主机名的WS。我正在尝试使用JAX-WS和Apache CXF实现这一目标,但到目前为止,我一直没有成功。

我可以使用CURL访问端点

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

这里的问题是,当我尝试访问WSDL时,我需要提供host参数。

这是我到目前为止尝试过的:

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

CURL命令可以访问相同的URL(并且没有主机名CURL也会抛出相同的503错误)。

到目前为止,我已经尝试了所有这些问题(包括系统属性方法)中描述的所有内容:

[就像那些答案中的注释所暗示的那样,我在pom中有cxf-rt-frontend-jaxrs cxf-rt-frontend-jaxwscxf-rt-transports-http,并且可以看到正在调用CXF

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

但是到目前为止,我还没有运气。有人可以帮我弄清楚我在做什么错吗?

spring spring-boot jax-ws cxfrs
1个回答
0
投票

我终于使它工作了,解决方案的诀窍很简单。

创建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);

此外,还需要按照此答案的说明设置受限标头属性:https://stackoverflow.com/a/50653672/2427453

© www.soinside.com 2019 - 2024. All rights reserved.