繁体   English   中英

如何在wsdl中获取未映射的SOAP错误消息

[英]How to get SOAP fault message have no mapped in wsdl

我从wsimport JAX-WS生成了我的客户端Soap,我已经使用了其他Web服务,该服务已经映射了故障消息,但是当前没有该服务。

当我调用该服务并返回错误消息时,我无法在Java中获取该消息,但是如果从soapUI进行调用,我会看到错误。

故障消息与成功相同,是从JAX-WS生成的。

我的代码:

//在我设置请求之前

try{
IPGApiOrderService iPGApiOrderService = new IPGApiOrderService();
IPGApiOrder client = iPGApiOrderService.getIPGApiOrderSoap11();
IPGApiOrderResponse response = client.ipgApiOrder(request)
}catch (SOAPFaultException soapEx) {
System.out.println("Fault ............. " + soapEx.getFault());
System.out.println("Detail ............ " + soapEx.getFault().getDetail());
System.out.println("FaultCode.......... " + soapEx.getFault().getFaultCode());
System.out.println("FaultActor......... " + soapEx.getFault().getFaultActor());
System.out.println("Message............ " + soapEx.getMessage());
soapEx.printStackTrace();
}

跟进

Fault ............. [SOAP-ENV:Fault: null]
Detail ............ [detail: null]
FaultCode.......... SOAP-ENV:Client
FaultActor......... null
Message............ Client received SOAP Fault from server: ProcessingException Please see the server log to find more detail regarding exact cause of the failure.
com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: ProcessingException Please see the server log to find more detail regarding exact cause of the failure.
    at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
    at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:124)
    at com.sun.xml.internal.ws.client.sei.StubHandler.readResponse(StubHandler.java:238)
    at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:189)
    at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:276)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:104)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147)
    at com.sun.proxy.$Proxy36.ipgApiOrder(Unknown Source)
    at com.firstdata.test.demo.MainTest.main(MainTest.java:53)

我通过以下步骤解决了我的问题。

  1. 创建SOAPHandler;
  2. 有必要实现4种方法;
  3. 在方法handleFault上,获取SOAPMessageContext-> SOAPMessage-> SOAPBody-> Fault-> Detail->添加带有xml错误或您想要的某些信息的详细信息。

3.1错误您可以放置​​错误代码,如果您正在使用的API总是向API错误返回一个代码错误。 4.在例外情况下,您会找到设置并使用的细节。

码:

public class SOAPHandlerImpl implements SOAPHandler<SOAPMessageContext> {

    public static final QName JSON_ERROR = new QName("json-error");

    public boolean handleMessage(SOAPMessageContext smc) {
        SOAPMessage message = smc.getMessage();
        Boolean isOut = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        return isOut;
    }

    @Override
public boolean handleFault(SOAPMessageContext context) {
    SOAPMessage message = context.getMessage();
    try {
        StringOutputStream str = new StringOutputStream();
        message.writeTo(str);
        ErrorDTO dto = XmlUtil.buildErroDTO(str.toString());
        Detail detail = message.getSOAPBody().getFault().getDetail();
        Gson gson = new Gson();
        String obj = gson.toJson(dto);
        detail.addDetailEntry(JSON_ERROR).addTextNode(obj);
        message.getSOAPBody().getFault().setFaultCode(String.valueOf(dto.getTransactionId()));
    } catch (Exception e) {
        System.out.println("Exception in handler: " + e);
    }
    return true;
}

    @Override
    public void close(MessageContext context) {
        // TODO Auto-generated method stub
    }

    @Override
    public Set<QName> getHeaders() {
        // TODO Auto-generated method stub
        return null;
    }
}

捕获异常

} catch (SOAPFaultException sopex) {
            ErrorDTO error = null;
            Iterator childElements = sopex.getFault().getDetail().getChildElements();
            while (childElements.hasNext()) {
                DetailEntry next = (DetailEntry) childElements.next();
                if (SOAPHandlerImpl.JSON_ERROR.getLocalPart().equals(next.getNodeName())) {
                    Gson gson = new Gson();
                    error = gson.fromJson(next.getValue(), ErrorDTO.class);
                }
            }
            String message = null;
            if(error.getProcessorResponseCode() != null) {
                message = ErrorApiUtil.getInstance().getMessage(error.getProcessorResponseCode());
            }else {
                message = error.getMessage();
            }
            throw new BusinessException(message);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM