无法从给定来源创建信封

coo*_*ler 6 java spring soap web-services

我正在尝试使用Spring WS 2.2.2发行版的org.springframework.ws.client.core.WebServiceTemplate类来使用基于SOAP的Web服务,如下所示:

webServiceTemplate.setDefaultUri(uri);
webServiceTemplate.setMessageSender(new SOAPMessageSenderWithAuth());
res = (RESPONSE) webServiceTemplate.marshalSendAndReceive(request);
Run Code Online (Sandbox Code Playgroud)

该请求是使用从Web服务的WSDL文件生成的类构建的.

Web服务已经使用SOAP UI成功测试,但是当使用Java访问它时,Exception" SoapMessageCreationException:无法从InputStream创建消息:无法从给定源创建信封(SAAJ0511) "和" 无法从给定源创建信封,因为root元素未命名为'Envelope'(SAAJ0514) ".

有没有人对此例外有任何建议?

提前致谢!

WebServiceTemplate的Spring bean 定义如下:

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"
    p:marshaller-ref="jaxbMarshaller"
    p:unmarshaller-ref="jaxbMarshaller"
    p:defaultUri="...">
    <constructor-arg ref="messageFactory"/>
        <property name="messageSender">
          <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
              <property name="credentials">
                  <bean class="org.apache.http.auth.UsernamePasswordCredentials">
                      <constructor-arg value="..."/>
                      <constructor-arg value="..."/>
                  </bean>
              </property>
          </bean>
      </property>
    </bean>
Run Code Online (Sandbox Code Playgroud)

例外情况是:

org.springframework.ws.soap.SoapMessageCreationException:无法从InputStream创建消息:无法从给定的源创建信封:; 嵌套异常是com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl:无法从给定源创建包络

这是使用Spring WS模板的Web服务客户端的类:

import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.ws.client.WebServiceIOException;
import org.springframework.ws.client.core.WebServiceTemplate;
import com.myproject.soap.client.services.SOAPWebServiceClient;

/**
 *
 * @param <REQUEST>
 * @param <RESPONSE>
 */
public class DefaultSOAPWebServiceClient<REQUEST, RESPONSE> implements SOAPWebServiceClient<REQUEST, RESPONSE>
{
    private final static Logger LOG = Logger.getLogger(DefaultSOAPWebServiceClient.class.getName());
    @Resource(name = "webServiceTemplate")
    private WebServiceTemplate webServiceTemplate;

    @Override
    public RESPONSE sendAndReceive(final REQUEST request, final String uri)
    {
        LOG.info("SOAP URL-" + uri);
        LOG.info("REQUEST-" + request.toString());
        RESPONSE res = null;

        try
        {
            res = (RESPONSE) webServiceTemplate.marshalSendAndReceive(uri, request);
        }
        catch (final WebServiceIOException e)
        {
            e.printStackTrace();
            LOG.error("Service with URI: " + uri + " is unreachable");
        }
        return res;
    }
}
Run Code Online (Sandbox Code Playgroud)

方法sendAndReceive被调用如下:

public MYDATAResponse createCustomer(final MYDATA request)
    {
        return (MYDATAResponse) soapWebServiceClient.sendAndReceive((REQUEST) request, getCreateCustomerURI());
    }
Run Code Online (Sandbox Code Playgroud)

小智 2

如果您在解析服务响应时遇到异常,请尝试从soap UI 发送请求并检查它是否正常工作。如果它在soap ui 中工作而不是在这里,那么您没有得到正确的响应,这可能是由于不正确的请求。就我而言,问题是代码中的端点 url 由“?wsdl”组成。删除后效果非常好。