标签: webservicetemplate

如何在Spring中构建SOAP客户端?

我能够使用Web服务发送请求javax.xml.soap.*,我想隐藏代码使用webServiceTemplate.

  • 我正在努力创建请求和结果对象.(我发现的样本与xml而非SOAP有关)
  • 我也想知道使用webServiceTemplate 结束是否有任何好处 java.xml.soap.如果我不能正确地做到这一点?鉴于我需要连接到20个Web服务.

它唯一的服务findEvents如下:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://ticketmaster.productserve.com/v2/soap.php" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
   <soapenv:Header/>
   <soapenv:Body>
      <soap:findEvents soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <request xsi:type="soap:Request">
            <!--You may enter the following 7 items in any order-->
            <apiKey xsi:type="xsd:string">?</apiKey>
            <country xsi:type="xsd:string">?</country>
            <resultsPerPage xsi:type="xsd:int">?</resultsPerPage>
            <currentPage xsi:type="xsd:int">?</currentPage>
            <sort xsi:type="soap:Request_Sort">
               <!--You may enter the following 2 items in any order-->
               <field xsi:type="xsd:string">?</field>
               <order xsi:type="xsd:string">?</order>
            </sort>
            <filters xsi:type="soap:ArrayOfRequest_Filter" soapenc:arrayType="soap:Request_Filter[]"/>
            <updatedSince xsi:type="xsd:string">?</updatedSince>
         </request>
      </soap:findEvents>
   </soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

try {
    SOAPConnectionFactory soapConnectionFactory =
            SOAPConnectionFactory.newInstance();
    SOAPConnection …
Run Code Online (Sandbox Code Playgroud)

java spring web-services spring-ws webservicetemplate

12
推荐指数
1
解决办法
8185
查看次数

spring&web服务客户端 - 故障详细信息

我如何获得SoapFaultClientException发送的故障详细信息?我使用WebServiceTemplate,如下所示:

WebServiceTemplate ws = new WebServiceTemplate();
ws.setMarshaller(client.getMarshaller());
ws.setUnmarshaller(client.getUnMarshaller());
try {
    MyResponse resp = (MyResponse) = ws.marshalSendAndReceive(WS_URI, req);
} catch (SoapFaultClientException e) {
     SoapFault fault =  e.getSoapFault();
     SoapFaultDetail details = e.getSoapFault().getFaultDetail();
      //details always NULL ? Bug?
}
Run Code Online (Sandbox Code Playgroud)

发送的Web服务错误似乎是正确的:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
  <soapenv:Fault>
     <faultcode>soapenv:Client</faultcode>
     <faultstring>Validation error</faultstring>
     <faultactor/>
     <detail>
        <ws:ValidationError xmlns:ws="http://ws.x.y.com">ERR_UNKNOWN</ws:ValidationError>
     </detail>
  </soapenv:Fault>
</soapenv:Body>
Run Code Online (Sandbox Code Playgroud)

谢谢

Willome

service spring webservicetemplate

5
推荐指数
3
解决办法
1万
查看次数

将连接超时设置为 HttpComponentsMessageSender 时的 java.lang.UnsupportedOperationException

我有一个使用 SOAP 向服务器发送消息的代码。我的代码如下所示:

private WebServiceTemplate makeTemplate() throws Exception {
  WebServiceTemplate localTemplate = new WebServiceTemplate();
  Jaxb2Marshaller marshaller = makeMarshaller();

  localTemplate.setMarshaller(marshaller);
  localTemplate.setUnmarshaller(marshaller);

  localTemplate.setMessageSender(httpComponentsMessageSender()); //<-- Add HttpComponentsMessageSender

  return localTemplate;
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个 HttpComponentsMessageSender 来向请求添加信任存储(并添加超时)

public HttpComponentsMessageSender httpComponentsMessageSender() throws Exception {
        HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
        httpComponentsMessageSender.setHttpClient(httpClient());
        httpComponentsMessageSender.setConnectionTimeout(30 * 1000);
        httpComponentsMessageSender.setReadTimeout(30 * 1000);

        return httpComponentsMessageSender;
    }

    public HttpClient httpClient() throws Exception {
        return HttpClientBuilder.create().setSSLSocketFactory(sslConnectionSocketFactory())
                .addInterceptorFirst(new RemoveSoapHeadersInterceptor()).build();
    }

    public SSLConnectionSocketFactory sslConnectionSocketFactory() throws Exception {
        // NoopHostnameVerifier essentially turns hostname verification off as otherwise following error
        // …
Run Code Online (Sandbox Code Playgroud)

java soap webservicetemplate

5
推荐指数
1
解决办法
1148
查看次数

无法使用 Spring 的 WebServiceTemplate 向消息添加 Http 标头

我有一个相当简单的案例,我试图将 HTTP 标头(不是 SOAP 标头)添加到我使用 Spring 的WebServiceTemplate.

我已经定义了ClientInterceptor我正在做的事情:

@Override
    public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {

        try {
            TransportContext context = TransportContextHolder.getTransportContext();
            HttpComponentsConnection connection = (HttpComponentsConnection) context.getConnection();
            connection.addRequestHeader("Authorization", String.format("Bearer %s", someAccessToken));
        } catch (IOException exception) {
            // Do nothing
        }

        return true;
        }
Run Code Online (Sandbox Code Playgroud)

这是我如何配置我的SomeClient延伸WebServiceConfigurationSupport

@Bean
public SomeClient someClient() {

    ...

    SomeClientImpl service =  new SomeClientImpl();

    service.setObjectFactory(new com.path.ObjectFactory());
    service.setDefaultUri(someUri);
    service.setMarshaller(marshaller);
    service.setUnmarshaller(marshaller);
    service.setxStreamMarshaller(xStreamMarshaller);
    service.setInterceptors(new ClientInterceptor[]{wss4jSecurityInterceptor()});
    service.setMessageSender(new HttpComponentsMessageSender());
    service.setInterceptors(new ClientInterceptor[]{wss4jSecurityInterceptor(), addHttpHeaderInterceptor()});
    return service;
}

@Bean …
Run Code Online (Sandbox Code Playgroud)

java spring soap header webservicetemplate

2
推荐指数
1
解决办法
6126
查看次数