当前位置: 首页 > 知识库问答 >
问题:

如何在Mule ESB3.8中从JAVA Transformer内部抛出自定义异常?

朱通
2023-03-14

骡子流曰:

  1. HTTP和CXF组件公开了给出两个整数之和的web服务。发送入请求的对象为:

公共类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;}}

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

有人能建议一下在Mule ESB中从JAVA Transformer发送自定义SOAP故障的最佳方法是什么吗?

共有1个答案

左康安
2023-03-14

我找到了一个使用TransformerException和CXF OutFaultInterceptor的解决方案。我的做法是:

>

  • 编写一个自定义transformer类,在其中添加验证规则。例如,如果我想抛出整数a或b为null的错误,我将添加一个自定义转换器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;
            }
        }
    }
    
    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());
        }   
    } 
    

  •  类似资料:
    • 我是一名Java编程新手(实际上已经在学习),我对如何处理不同的消息有些怀疑。 我的目标是将这些不同的消息包含在同一个类(CustomExcpse类)中,以避免在从其他类抛出新CustomExceptions的每个方法上一遍又一遍地编写相同的字符串。 到目前为止,我编码: > 一个自定义异常类,它从异常扩展而来,具有不同的消息(在示例中只有两个,但还有更多)作为Strings包含,当然还有构造函数

    • 我在Project中使用了Spring Boot和JWT以及Spring security。Spring Boot:2.3.5.发布JJWT Verison:0.11.2 我想要以下异常响应,这是我的自定义响应类:

    • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

    • 我必须使用访问者设计模式编写一个应用程序,如(https://www.baeldung.com/java-visitor-pattern),一个示例元素如下所示: vistor界面看起来像下面的代码,我可能不会更改界面代码。 在Visitor(AbstractVisitor类)的实现中,如果hashtable子befehle中还没有调用类的id,我必须抛出一个“UndefinedSubroutin

    • 主要内容:前记,1.自定义视图,2.自定义异常,3.自定义异常的原理前记 在前面的文章中, 表示了视图解析的原理和异常解析器的解析原理。 这篇通过如何自定义视图和自定义异常处理和自定义异常处理的原理进行说明。 这里说明一下, 自定义的视图和自定义的异常都是会代替容器默认的组件的, 异常还好说, 就是不符合就抛, 视图的话需要注意一下优先级, 可以在自定义的视图解析器上加上注解。 1.自定义视图 这里原理就是添加一个视图和视图解析器, 然后放入容器中, 最后访问相应

    • 当在Spring中实现全局异常处理程序时,我注意到,如果不能识别接受头,Spring会抛出它自己的内部错误。我需要的是返回一个自定义的JSON错误结构。适用于特定于应用程序的异常,完全失败。 此代码告诉我"未能调用@ExceptionHandler方法:publicjava.util.Map RestExceptionHandler.springMalformedAcceptHeaderExcti