【问题标题】:Cannot create envelope from given source无法从给定来源创建信封
【发布时间】:2015-10-13 06:30:41
【问题描述】:

我正在尝试使用 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);

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

Web 服务已通过 SOAP UI 成功测试,但使用 Java 访问时出现异常“SoapMessageCreationException:无法从 InputStream 创建消息:无法从给定源创建信封 (SAAJ0511)”和“无法从给定源创建信封,因为根元素未命名为“信封”(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>

例外是:

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;
    }
}

sendAndReceive方法是这样调用的:

public MYDATAResponse createCustomer(final MYDATA request)
    {
        return (MYDATAResponse) soapWebServiceClient.sendAndReceive((REQUEST) request, getCreateCustomerURI());
    }

【问题讨论】:

  • 你为什么在模板构建后搞乱属性。配置后,您不应设置默认 uri 或消息发送者。删除设置并改用webServiceTemplate.marshalSendAndReceive(uri, request) 方法。
  • 感谢您的提示!我会调整它,但 SAAJ0511 和 SAAJ0514 例外仍然存在......
  • 你没有提到异常编号,那是什么异常......
  • 看起来您只是发送了错误的对象,但您没有显示足够的代码。
  • 首先:感谢您的帮助!例外编号为 SAAJ0514 和 SAAJ0511。所以你认为我试图发送的对象与实际的 WSDL-Scheme 不匹配?我将尝试从相应的 WSDL 文件中再次为请求生成类

标签: java spring web-services soap


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多