Как получить сообщение о сбое SOAP не отображается в wsdl - PullRequest
0 голосов
/ 03 июля 2018

Я сгенерировал свое клиентское мыло из wsimport JAX-WS, я уже использовал другой веб-сервис, который отображал сообщение об ошибке, но ток службы не имеет.

Когда я вызываю службу и она возвращает сообщение об ошибке, я не могу получить сообщение в 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 Ответ

0 голосов
/ 14 июля 2018

Я решил свою проблему с помощью следующих шагов.

  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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...