简体   繁体   English

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

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

I generated my client soap from wsimport JAX-WS, I have already consumed others webservice that it had fault message mapped, but the service current doesn't have. 我从wsimport JAX-WS生成了我的客户端Soap,我已经使用了其他Web服务,该服务已经映射了故障消息,但是当前没有该服务。

When I call the service and it returns fault message I can't get the message in the Java, but if call from soapUI I can see the error. 当我调用该服务并返回错误消息时,我无法在Java中获取该消息,但是如果从soapUI进行调用,我会看到错误。

The fault message is the same of the success, generated from JAX-WS. 故障消息与成功相同,是从JAX-WS生成的。

My code: 我的代码:

//before I setter my request //在我设置请求之前

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

follow the out 跟进

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)

I resolved my problem with following steps. 我通过以下步骤解决了我的问题。

  1. Create SOAPHandler; 创建SOAPHandler;
  2. It'll be necessary implement 4 methods; 有必要实现4种方法;
  3. On method handleFault get SOAPMessageContext -> SOAPMessage -> SOAPBody -> Fault -> Detail -> add detail with xml error or some information do you want. 在方法handleFault上,获取SOAPMessageContext-> SOAPMessage-> SOAPBody-> Fault-> Detail->添加带有xml错误或您想要的某些信息的详细信息。

3.1 Fault you can put fault code, if API you was consuming always return one code error to API fault. 3.1错误您可以放置​​错误代码,如果您正在使用的API总是向API错误返回一个代码错误。 4. On exception you find that detail you set and work with it. 4.在例外情况下,您会找到设置并使用的细节。

Code: 码:

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 exception 捕获异常

} 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