Как создать пользовательское исключение изнутри JAVA Transformer в Mule ESB 3.8? - PullRequest
0 голосов
/ 25 января 2019

Я реализую сервис SOAP в Mule ESB версии 3.8 с использованием компонентов HTTP и CXF.Пожалуйста, смотрите прикрепленное изображение для дизайна потока.

Поток Mule:

  1. Компоненты HTTP и CXF предоставляют веб-сервис, который дает сумму двух целых чисел.Объект, отправляемый в запросе:

открытый класс AddValues ​​{private int a;private int b;public setA (int a) {this.a = a;} public getA () {return a;} public setB (int b) {this.b = b;} public getB () {return b;}}

Сохраните действие SOAP с помощью переменной. На основе действия SOAP направьте элемент управления потоком.

Использование преобразователя JAVA для получения полезной нагрузки и выдачи исключения сбоя Custom Webследующим образом:

public class AddValuesBusinessLogic extends AbstractMessageTransformer 
{
    @Override
    public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {
    MuleMessage muleMessage = message;
    AddValues addValues = (AddValues) muleMessage.getPayload();
    if (addValues.getA() == null || addValues.getB() == null ) {
        //Make an AddValueException object
        throw new Exception("Add value exception");
    }
    return null;
}

}

Но я получаю сообщение об ошибке "Surround с try / catch"

У меня вопрос, если я окружаюи обработать исключение, как я собираюсь отправить сбой SOAP конечному пользователю?

Может кто-нибудь подсказать, как лучше всего отправить нестандартный сбой SOAP из JAVA Transformer в Mule ESB?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Я нашел решение, используя TransformerException и CXF OutFaultInterceptor.Мой подход заключается в следующем:

  1. Напишите собственный класс преобразователя внутри, который добавляет правила проверки.Например, если я хочу выдать Error для Integer a или b, равным NULL, я добавлю Custom Transformer AddValuesBusinessLogic.class со следующим кодом:

    public class AddValuesBusinessLogic extends AbstractMessageTransformer 
    {
        @Override
        public Object transformMessage(MuleMessage message, String outputEncoding) throws 
        TransformerException 
        {
            MuleMessage muleMessage = message;
            AddValues addValues = (AddValues) muleMessage.getPayload();
            if (addValues.getA() == null || addValues.getB() == null ) {
            //Make an AddValueException object
            throw new TransformerException(this,new AddValueException("BAD REQUEST"));
        }
        return "ALL OK";}
    

Это исключение будетПерейдите к CXF, где я пишу OutFaultInterceptor следующим образом:

public class AddValuesFaultInterceptor extends AbstractSoapInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(AddValuesFaultInterceptor.class);

    public AddValuesFaultInterceptor() {
        super(Phase.MARSHAL);
    }

    public void handleMessage(SoapMessage soapMessage) throws Fault {
        Fault fault = (Fault) soapMessage.getContent(Exception.class);

        if (fault.getCause() instanceof org.mule.api.transformer.TransformerMessagingException) {           
            Element detail = fault.getOrCreateDetail();
            Element errorDetail = detail.getOwnerDocument().createElement("addValuesError");
            Element errorCode = errorDetail.getOwnerDocument().createElement("errorCode");
            Element message = errorDetail.getOwnerDocument().createElement("message");
            errorCode.setTextContent("400");
            message.setTextContent("BAD REQUEST");
            errorDetail.appendChild(errorCode);
            errorDetail.appendChild(message);
            detail.appendChild(errorDetail);
        }
    }
    private Throwable getOriginalCause(Throwable t) {
        if (t instanceof ComponentException && t.getCause() != null) {
            return t.getCause();
        } else {
            return t;
        }
    }
}

Теперь, когда я выполняю вызов с использованием клиента SOAPUI или jaxws, в ответе SOAP я получаю исключение пользовательской ошибки.

Чтобы извлечь значения errorCode и errorMessage в клиенте JAXWS, я делаю следующее в блоке catch try-catch:

catch (com.sun.xml.ws.fault.ServerSOAPFaultException soapFaultException) {

    javax.xml.soap.SOAPFault fault = soapFaultException.getFault(); // <Fault> node
    javax.xml.soap.Detail detail = fault.getDetail(); // <detail> node
    java.util.Iterator detailEntries = detail.getDetailEntries(); // nodes under <detail>'
    while(detailEntries.hasNext()) {
        javax.xml.soap.DetailEntry detailEntry = (DetailEntry) detailEntries.next();
        System.out.println(detailEntry.getFirstChild().getTextContent());
        System.out.println(detailEntry.getLastChild().getTextContent());
    }   
} 

На данный момент это работает для меня.Однако я буду просить предложения по улучшению этого решения или, если есть какие-либо лучшие решения.

Спасибо всем.

0 голосов
/ 25 января 2019

Вы должны создать свою собственную ошибку SOAP (обычную строку Java) и вернуть ее в виде сообщения. Если вы хотите, вы также можете создать трансформатор и поместить его в ваш catch-exception-strategy, например:

@Override
public Object transformMessage(MuleMessage message, String outputEncoding)
    throws TransformerException {

    String exceptionMessage = message.getExceptionPayload().getException().getCause().getMessage();        

    String outputMessage = "<soap:Fault xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">        " +
        " <faultcode>soap:Server</faultcode> " +
        "<faultstring>" + exceptionMessage + "</faultstring>" +
        "</soap:Fault>";

    return outputMessage;
}

Мул всегда ожидает, что исключения будут инкапсулированы в TransformerException, поэтому вы должны выбросить новое TransformerException, установив в качестве причины свое собственное исключение.

...