开发者社区 问答 正文

Spring-WS Client-WebServiceTransportException:Spri

我试图编写SOAP Web服务客户端,并org.springframework.ws.client.WebServiceTransportException: Internal Server Error [500]在SpringBoot中调用SOAP WS客户端时出现错误。

请找到以下SOAP WS客户端:

SOAPConnector.java
@Service
public class SOAPConnector extends WebServiceGatewaySupport {

    @Value("${soap.mw.url}")
    String soapMwUrl;

    @Value("${soap.mw.username}")
    private String username;

    @Value("${soap.mw.password}")
    private String password;

    private static final String SCHEMA_PREFIX = "oas";

    public Object callWebService(Object request) {

        getWebServiceTemplate().setCheckConnectionForFault(false);

        return getWebServiceTemplate().marshalSendAndReceive(soapMwUrl, request, new WebServiceMessageCallback() {

            @Override
            public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {

                try {

                    SaajSoapMessage saajSoapMessage = (SaajSoapMessage) message;

                    saajSoapMessage.setSoapAction("/updateData");

                    SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
                    SOAPPart soapPart = soapMessage.getSOAPPart();
                    SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
                    SOAPHeader soapHeader = soapEnvelope.getHeader();

                    SOAPHeaderElement securityHeader = soapHeader
                            .addHeaderElement(new QName(Constants.SECURITY_NS, "Security", SCHEMA_PREFIX));
                    SOAPElement usernameToken = securityHeader.addChildElement("UsernameToken", SCHEMA_PREFIX);
                    SOAPElement usernameElement = usernameToken.addChildElement("Username", SCHEMA_PREFIX);
                    SOAPElement passwordElement = usernameToken.addChildElement("Password", SCHEMA_PREFIX);

                    usernameElement.setTextContent(username);
                    passwordElement.setTextContent(password);

                    securityHeader.setMustUnderstand(true);



                } catch (Exception e) {
                    throw new IOException("Error while adding authentication.");
                }
            }
        });
    }
}

错误:

org.springframework.ws.client.WebServiceTransportException: Internal Server Error [500]
        at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:699)
        at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:609)
        at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
        at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390)
        ......SOAPConnector.callWebService(SOAPConnector.java:41)

有人可以帮忙吗?

展开
收起
垚tutu 2019-12-26 18:21:45 1397 分享 版权
阿里云 AI 助理回答

遇到org.springframework.ws.client.WebServiceTransportException: Internal Server Error [500]错误,通常意味着SOAP服务端返回了一个内部服务器错误(HTTP状态码500),这表明问题可能出在服务端而不是客户端。尽管如此,还是有一些步骤和检查可以确保客户端配置正确,并尝试解决问题:

  1. 确认SOAP服务端点URL:首先确保${soap.mw.url}的值是正确的,没有拼写错误或路径问题。你可以直接通过浏览器或Postman等工具尝试访问该URL(如果它允许这样做)来验证其可达性。

  2. 检查SOAP Action:你设置的SOAPAction (/updateData) 是否与服务端期望的值一致?这个值需要与服务端定义的操作相匹配。确认这一点可能需要查看服务端的WSDL文件或者直接与服务提供者沟通。

  3. 日志和调试信息:增加服务端的日志记录级别,以便获取更详细的错误信息。这将帮助识别导致500错误的具体原因。同时,在客户端也可以通过Spring的详细日志记录来观察发送的SOAP请求是否符合预期。

  4. 认证问题:虽然你的代码中已经添加了基本的认证信息(用户名和密码),但要确保这些凭证是正确的,并且服务端支持这种认证方式。另外,检查是否有其他特定的认证机制(如OAuth、API密钥等)被服务端要求。

  5. 消息格式:确认SOAP消息的结构、命名空间以及元素是否完全符合服务端的期待。有时候,即使是最小的差异,比如命名空间不匹配,也会导致服务端无法正确解析请求。

  6. 使用SoapUI或Postman进行测试:为了进一步隔离问题,可以尝试使用SoapUI或Postman构造一个相同的SOAP请求手动发送,看是否同样收到500错误。这样可以帮助确定问题是出在客户端代码上还是服务端处理逻辑。

  7. 服务端状态:确认服务端应用程序的状态,包括但不限于内存、CPU使用情况,以及任何近期的部署或配置变更,这些都可能是导致500错误的原因。

如果以上所有检查都没有发现明显的问题,建议联系服务的提供者或维护团队,以获取更多关于错误详情的信息,因为500错误通常是由于服务端处理请求时发生的异常引起的。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: