Java 通过https和防火墙的SOAP Spring客户端请求

Java 通过https和防火墙的SOAP Spring客户端请求,java,spring,ssl,websphere,soap-client,Java,Spring,Ssl,Websphere,Soap Client,我已经有一段时间没有编写SOAP客户机了,但我正在尝试编写一个通过https和防火墙连接/使用外部SOAP服务的客户机 我已经手动提取了wsdl和模式,并使用EclipseWeb服务客户机特性来生成Web服务代码。我现在通过get请求调用客户机代码,只是想看看是否可以连接到WS。我可以在Chrome\IE中浏览WSDL,并能够使用ReadyApi在Java和RAD/WebSphere之外测试连接 @Bean public Jaxb2Marshaller marshaller() { Ja

我已经有一段时间没有编写SOAP客户机了,但我正在尝试编写一个通过https和防火墙连接/使用外部SOAP服务的客户机

我已经手动提取了wsdl和模式,并使用EclipseWeb服务客户机特性来生成Web服务代码。我现在通过get请求调用客户机代码,只是想看看是否可以连接到WS。我可以在Chrome\IE中浏览WSDL,并能够使用ReadyApi在Java和RAD/WebSphere之外测试连接

@Bean
public Jaxb2Marshaller marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();     
    marshaller.setPackagesToScan("com.complianceservice.client");
    try {
        marshaller.afterPropertiesSet();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return marshaller;
}
@Bean
public VendorClient vendorClient(Jaxb2Marshaller marshaller) {
    VendorClient client = new VendorClient ();
    client.setDefaultUri("https://webservice.vendor.com/WebServices/productServices.svc?wsdl");
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);
    return client;
}
这将调用客户端服务代码

@GetMapping(value = "/health")
public String getHealth() throws ResponseException {
    Response response = vendorComplianceService.processHealth();
    return response!= null?"Health, OK":"Problem detected";
}

@Override
public MessageResponse processHealth() throws ResponseException {
    try {
        GetDaysUntilPasswordExpiresResponse response = vendorClient.getGetDaysUntilPasswordExpires();
        if (response != null){
            MessageResponse myResponse = new MessageResponse();
        //set something
            return myResponse;
        }
    } catch (Exception e) {
        e.printStackTrace();
        throw new ResponseException(e);
    }       
    return null;
}

public GetDaysUntilPasswordExpiresResponse getGetDaysUntilPasswordExpires( ){

    GetDaysUntilPasswordExpires requestPayload = new GetDaysUntilPasswordExpires();
    requestPayload.setContext(healthClientContext());   
    log.info("Requesting expire info for :" + clientContext.getUserID());       
    GetDaysUntilPasswordExpiresResponse response = (GetDaysUntilPasswordExpiresResponse) getWebServiceTemplate()
            .marshalSendAndReceive("https://webservice.vendor.com/WebServices/IAccount/GetDaysUntilPasswordExpires", requestPayload                     
            );
    return response;
}
这将只是从服务器寻找连接响应的超时,因为我们的防火墙正在阻止它

我如何告诉这个客户机代码使用代理设置通过Java/Spring中的防火墙?在REST中,我可以指定使用带有ssl连接套接字工厂的代理凭据提供程序的httpclient。我不知道如何使用使用WebServiceTemplate进行封送、发送和接收的SOAP客户端实现这一点。这是个好主意吗

另外,如何记录或查看实际的SOAP请求以确保发送的格式正确


对于那些熟悉WebSphere的人,我如何确保远程证书正确安装并可用

对于问题的最后一部分,您通常会选择“CellDefaultTrustStore”和“Retrieve from port”,指定远程服务器和端口:


(我没有关于代理问题的答案。)

对于问题的最后一部分,您通常会选择“CellDefaultTrustStore”和“Retrieve from port”,指定远程服务器和端口:


(我没有关于代理问题的答案。)

将@dbreaux帮助添加到WAS的组合解决了这个问题,以下内容解决了这个问题

在AppConfig中,我添加了这个bean

@Bean
public WebServiceTemplate webServiceTemplate(){
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
    MessageFactory msgFactory = null;
    try {
        msgFactory = MessageFactory.newInstance(SOAPConstants.DEFAULT_SOAP_PROTOCOL);
    } catch (SOAPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    SaajSoapMessageFactory newSoapMessageFactory = new SaajSoapMessageFactory(msgFactory);
    webServiceTemplate.setMessageFactory(newSoapMessageFactory);
    webServiceTemplate.setMarshaller(marshaller());
    webServiceTemplate.setUnmarshaller(marshaller());
    return webServiceTemplate; 
}

//and then wired into the client component and set system properties for https proxy

public GetDaysUntilPasswordExpiresResponse getGetDaysUntilPasswordExpires(  ){
    System.getProperties().put("https.proxyHost", HTTPS_PROXY_HOST );  
    System.getProperties().put("https.proxyPort", HTTPS_PROXY_PORT);

    System.getProperties().put("https.proxyUser", HTTPS_PROXY_USER );  
    System.getProperties().put("https.proxyPassword", HTTPS_PROXY_PASSWORD);
    GetDaysUntilPasswordExpires requestPayload = new GetDaysUntilPasswordExpires();
    requestPayload.setContext( healthClientContext());

    log.info("Requesting expire info for :" + healthClientContext.getUserID()); 
    GetDaysUntilPasswordExpiresResponse response = (GetDaysUntilPasswordExpiresResponse) webServiceTemplate 
            .marshalSendAndReceive(
                    VENDOR_WS_URL+"/Account"
                    ,requestPayload 
                    ,new SoapActionCallback(VENDOR_WS_NAMESPACE_URL+"/IAccount/GetDaysUntilPasswordExpires"){
                        @Override
                        public void doWithMessage(WebServiceMessage message)
                                throws IOException {
                            SaajSoapMessage soapMessage = (SaajSoapMessage) message;
                            soapMessage.setSoapAction(VENDOR_WS_NAMESPACE_URL+"/IAccount/GetDaysUntilPasswordExpires");   
                        }
                    }
            );
    return response;
}

将@dbreaux帮助添加到WAS的@dbreaux组合解决了这个问题

在AppConfig中,我添加了这个bean

@Bean
public WebServiceTemplate webServiceTemplate(){
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
    MessageFactory msgFactory = null;
    try {
        msgFactory = MessageFactory.newInstance(SOAPConstants.DEFAULT_SOAP_PROTOCOL);
    } catch (SOAPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    SaajSoapMessageFactory newSoapMessageFactory = new SaajSoapMessageFactory(msgFactory);
    webServiceTemplate.setMessageFactory(newSoapMessageFactory);
    webServiceTemplate.setMarshaller(marshaller());
    webServiceTemplate.setUnmarshaller(marshaller());
    return webServiceTemplate; 
}

//and then wired into the client component and set system properties for https proxy

public GetDaysUntilPasswordExpiresResponse getGetDaysUntilPasswordExpires(  ){
    System.getProperties().put("https.proxyHost", HTTPS_PROXY_HOST );  
    System.getProperties().put("https.proxyPort", HTTPS_PROXY_PORT);

    System.getProperties().put("https.proxyUser", HTTPS_PROXY_USER );  
    System.getProperties().put("https.proxyPassword", HTTPS_PROXY_PASSWORD);
    GetDaysUntilPasswordExpires requestPayload = new GetDaysUntilPasswordExpires();
    requestPayload.setContext( healthClientContext());

    log.info("Requesting expire info for :" + healthClientContext.getUserID()); 
    GetDaysUntilPasswordExpiresResponse response = (GetDaysUntilPasswordExpiresResponse) webServiceTemplate 
            .marshalSendAndReceive(
                    VENDOR_WS_URL+"/Account"
                    ,requestPayload 
                    ,new SoapActionCallback(VENDOR_WS_NAMESPACE_URL+"/IAccount/GetDaysUntilPasswordExpires"){
                        @Override
                        public void doWithMessage(WebServiceMessage message)
                                throws IOException {
                            SaajSoapMessage soapMessage = (SaajSoapMessage) message;
                            soapMessage.setSoapAction(VENDOR_WS_NAMESPACE_URL+"/IAccount/GetDaysUntilPasswordExpires");   
                        }
                    }
            );
    return response;
}

这是“传统”WebSphere还是WebSphere Liberty?传统WAS这是“传统”WebSphere还是WebSphere Liberty?传统WAS我有不止一个,但当我看到并使用“安全性”>“SSL证书和密钥管理”>“SSL配置”>“默认设置”下列出的“默认”信任库时,这是导入根CA的正确密钥库。我有多个密钥库,但当我看到并使用“安全性”>“SSL证书和密钥管理”>“SSL配置”>“默认设置”下列出的“默认”信任库时,我发现这是导入根CA的正确密钥库。