在我设计的一个流程中,我有一个Validation组件,它带有一个自定义验证器,它引用了一个类DataValidator
,实现了mule Validator接口。在DataValidator
中,我验证了几个属性,并希望为每个属性抛出不同类型的异常(可能是由我创建的自定义异常)。这可能吗?
我的理解是,通过指定exceptionClass
,Validation组件只会抛出该类的异常。
可以选择使用ExceptionFactory代替exceptionClass
。
使用它可以抛出几种类型的异常吗?如果是这样,我该如何使用它?我查看了this博客
发帖,但不太了解它。
如果这一切都不可能,有什么方法可以在自定义验证器组件中获取ValidationResult消息,以便我可以在消息中使用它吗?
答案 0 :(得分:1)
是的,您可以抛出几种类型的异常。如您所述,您必须实现DataValidator
和ExceptionFactory
接口并配置您的组件才能使用它们。
使用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:
上面的接口接收被拒绝的事件 验证和引发错误的验证器。这个方法是 旨在返回要抛出的异常但不抛出异常。 此接口的实现不应该抛出异常。他们 也应该是线程安全的并且具有公共默认构造函数。看到 还