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

标签 java validation exception mule custom-exceptions

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

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

可以选择使用 ExceptionFactory而不是 exceptionClass。 使用它是否允许抛出多种类型的异常?如果是这样,我该如何使用它?我检查了 this博客 帖子,但理解得不够好。

如果这一切都不可能,我有什么办法可以得到 ValidationResult自定义 validator 组件中的消息,以便我可以在消息中使用它?

最佳答案

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

在 Studio 中,选择“使用异常工厂配置” 并指定您要使用的完整类名。使用 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 并使用异常工厂引用您的配置、您的 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");
        }
    }

}

接口(interface)似乎有两种方法,一种返回泛型,另一种返回普通的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

关于Java,Mule - 在一个验证组件上抛出不同类型的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47553347/

相关文章:

c# - 多个字段的 MVC 表单验证

php - 在这种情况下我应该重新抛出异常吗?

Ice Cream Sandwich 上的 Android Visualizer(音频效果)运行时异常

Java 正则表达式 View 状态

java - 如何创建一个在两种泛型类型上运行的可迭代泛型类?

java - 在java中将IST转换为PST

java - 不能为 ForkJoinPool 提供线程工厂或名称模式吗?

html - 使用 knockoutjs 时 Chrome 中的最大长度约束验证异常

javascript - Jquery使用Html 5数据属性和默认值进行自定义验证

java - 为什么 InstantiationException 是检查异常?