Java,Mule - 在一个验证组件上抛出不同类型的异常

时间:2017-11-29 12:51:37

标签: java validation exception mule custom-exceptions

在我设计的一个流程中,我有一个Validation组件,它带有一个自定义验证器,它引用了一个类DataValidator,实现了mule Validator接口。在DataValidator中,我验证了几个属性,并希望为每个属性抛出不同类型的异常(可能是由我创建的自定义异常)。这可能吗?

我的理解是,通过指定exceptionClass,Validation组件只会抛出该类的异常。

可以选择使用ExceptionFactory代替exceptionClass。 使用它可以抛出几种类型的异常吗?如果是这样,我该如何使用它?我查看了this博客 发帖,但不太了解它。

如果这一切都不可能,有什么方法可以在自定义验证器组件中获取ValidationResult消息,以便我可以在消息中使用它吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以抛出几种类型的异常。如您所述,您必须实现DataValidatorExceptionFactory接口并配置您的组件才能使用它们。

使用Studio,选择"使用例外工厂配置" 并指定要使用的完整类名。使用XML,指定您在exception-factory中实施的validation-config。 (您也可以配置Spring Bean并引用它):

    <validation:config name="Validation_Configuration" doc:name="Validation Configuration">
        <validation:exception-factory class="com.mycomp.validation.MyExceptionFactory"/>
    </validation:config>

在您的流程中配置custom-validator并使用异常工厂,验证程序实现以及要使用exceptionClass引发的异常类型来引用您的配置。为了能够抛出任何类型的异常,请指定java.lang.Exception或您想要使用的自定义异常可以继承的类:

<flow name="validation-exceptionFlow">
    ...
    <validation:custom-validator
        config-ref="Validation_Configuration" 
        class="com.mycomp.validation.MyValidator"
        exceptionClass="java.lang.Exception" 
        doc:name="Validation" />
    ...
</flow>

根据您的需要,您可能希望以不同的方式指定exceptionClass,这个想法是您的实际异常应该扩展它。

Yout ExceptionFactory实施由您决定。您可以返回任何您想要的异常...例如:

public class MyExceptionFactory implements ExceptionFactory{

    @Override
    public <T extends Exception> T createException(ValidationResult result, Class<T> exceptionClass, MuleEvent event) {
        return (T) createException(result, exceptionClass.getCanonicalName(), event);
    }

    @Override
    public Exception createException(ValidationResult result, String exceptionClassName, MuleEvent event) {
        //...
        //some logic to identify which kind of exception you want to throw
        //from result and event
        //...
        if(something) {
            return new SomeException("Something happened");
        } else if (somethingElse) {
            return new AnotherException("I am en error...");
        } else {
            return new BananaException("Ook");
        }
    }

}

界面看起来有两个方法,一个返回泛型,另一个返回普通Exception。我不知道ExceptionFactory的具体用法,但我无法提供更多指导,但请注意,Mule可能会调用这些方法中的任何一种,the doc provides some requirements

  

上面的接口接收被拒绝的事件   验证和引发错误的验证器。这个方法是   旨在返回要抛出的异常但不抛出异常。   此接口的实现不应该抛出异常。他们   也应该是线程安全的并且具有公共默认构造函数。看到   还