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

Java, Mule - Throw different types of exceptions on one Validation component

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

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

可以选择使用 ExceptionFactory 而不是 exceptionClass。 使用它是否允许抛出多种类型的异常?如果是这样,我该如何使用它?我查看了 this 博客 post,但没看懂。

在可能 none 的情况下,有什么方法可以在自定义验证器组件中获取 ValidationResult 消息,以便我可以在消息中使用它?

是的,您可以抛出多种类型的异常。正如您提到的,您必须实现 DataValidatorExceptionFactory 接口并配置您的组件以使用它们。

在 Studio 中,选择 "Use Exception Factory Config" 并指定要使用的完整 class 名称。使用 XML,指定您在 validation-config 中实施的 exception-factory。 (你也可以配置一个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 或 class,您要使用的自定义异常可以从中继承:

<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,想法是您的实际异常应该扩展它。

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

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

}

接口似乎有两种方法,一种是 return 通用的,另一种是普通的 Exception。不知道你的 ExceptionFactory 的具体用法我无法提供太多指导,但请注意 Mule 可能会调用这些方法中的任何一个,并且 the doc provides some requirements:

The above interface receives the Event that was rejected by the validation and the validator that raised the error. This method is intended to return the exception to be thrown but not to throw it. Implementations of this interface should never throw exceptions. They should also be thread-safe and have a public default constructor. See Also