EnjoyingSoft之Mule ESB实施案例开发分享:使用MuleESB的验证模块

我们的客户在使用Mule ESB开发时,通常会提出验证来源消息是否正确的需求。我们在实施Mule ESB的时候,使用Mule中的验证模块来解决这类问题。

本篇文章,我们将讲解如何使用Mule ESB的验证模块。在验证模块中,我们可以通过设定一些条件表达式,来验证Mule Flow中的Message是否符合预期。Mule ESB中的验证模块提供了一种简单的开箱即用的方法,来验证消息流(Flow)中的消息(Mule Message)。

Mule ESB中过滤器(Filter)与验证模块(Validation)的区别

与使用过滤器相比,验证模块的主要优点是可跟踪性,因为过滤器都会引发相同的异常,这使得我们很难知道异常是在哪里引起的。因此,如果在同一个流中有两个过滤器,我们就无法知道哪个过滤器失败了,也无法自定义异常类型。另一方面,验证器通过附加有意义的消息来触发异常,因此我们可以自定义异常类型。

Mule ESB社区版和企业版都支持验证模块。

验证模块的设计遵循以下原则:

  • 如果消息不满足指定的条件,验证将失败并抛出ValidationException。
  • 默认情况下,此异常附带一条有意义的消息。您可以选择自定义此消息并更改抛出的异常类型,只要新的异常类型覆盖Exception类的一个构造函数(String)。
  • 如果您想抛出一个缺少上述构造函数的异常类型,或者异常的创建方法很复杂,又或者希望它包含额外的信息。验证模块也支持这种用法。

如何使用验证器

内置验证器的类型

下面是常用的验证器,有关验证器的完整列表,请参阅MuleSoft关于验证组件的文章。请注意条件表达式的应用。

  • Email邮箱地址验证器

    1
    <validation:is-email email="Contact@EnjoyingSoft.com" />
  • 正则表达式验证器

    1
    <validation:matches-regex value="#[payload]" regex="/^[A-z]+$/" message="Name can not contain Integer value" />
  • Not Empty验证器

    1
    <validation:is-not-empty value="#[payload.staffId]" message="Staff Id is mandatory to supply" />
  • Size验证器

    1
    <validation:validate-size value="#[payload.age]" min="1" max="120" message="Please provide correct age" />
  • Not Null验证器

    1
    <validation:not-null expression="#[payload]" value="#[payload]" />
  • 数字验证器

    1
    <validation:is-number value="#[payload.Id]" numberType="INTEGER" message="ID can not be String or any other data Type" />

如何同时验证多个条件

在某些场景中,你有可能希望验证多个条件,其中多个条件可能同时失败。你可能还希望这个错误描述中包含所有描述的错误。解决方案就是使用All Validator。让我们来看看如何在Mule应用程序中使用All Validator。在本例中,REST客户端发起HTTP调用,Mule应用接收到JSON请求,该请求将使用ALL Validator组件进行验证。

Mule UI Config:

XML Config:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:json="http://www.mulesoft.org/schema/mule/json"
xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:validation="http://www.mulesoft.org/schema/mule/validation"
xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/validation http://www.mulesoft.org/schema/mule/validation/current/mule-validation.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd">
<http:listener-config name="HTTP_Listener_Configuration"
host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration" />
<validation:config name="Validation_Configuration"
doc:name="Validation Configuration" />
<flow name="ValidationComponent">
<http:listener config-ref="HTTP_Listener_Configuration"
path="/validation" doc:name="HTTP" />
<byte-array-to-string-transformer
doc:name="Byte Array to String" />
<validation:all config-ref="Validation_Configuration"
doc:name="Validation">
<validation:validations>
<validation:is-number value="#[json:id]"
numberType="INTEGER" message="ID can not be String data Type" />
<validation:is-not-empty value="#[json:account]"
message="Account Number Required" />
<validation:matches-regex value="#[json:name]"
regex="^[a-zA-Z]+$"
message="Name can not contain Integer value and other special charectors" />
<validation:validate-size value="#[json:age]"
min="2" max="3" message="Please provide correct age" />
<validation:is-email email="#[json:email]" />
</validation:validations>
</validation:all>
<logger level="INFO" message="Validation Successful" doc:name="Logger"></logger>
</flow>
</mule>

使用正确的Json示例

1
2
3
4
5
6
7
{
"id": 123,
"account": 1234,
"name": "EnjoyingSoft",
"age": 20,
"email": "Contact@EnjoyingSoft.com"
}

使用错误的Json示例

1
2
3
4
5
6
7
{
"id": "123",
"account": 12,
"name": "EnjoyingSoft",
"age": 2,
"email": "www.enjoyingsoft.com"
}

在Mule的应用日志里,可以看到如下的错误信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ERROR 2019-09-07 17:54:27,265 [[valida].HTTP_Listener_Configuration.worker.01] org.mule.exception.DefaultMessagingExceptionStrategy: 
********************************************************************************
Message : Please provide correct age
www.enjoyingsoft.com is not a valid email address
Payload : {
"id": "123",
"account": 12,
"name": "EnjoyingSoft",
"age": 2,
"email": "www.enjoyingsoft.com"
}
Payload Type : java.lang.String
Element : /ValidationComponent/processors/1 @ valida
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.extension.validation.api.MultipleValidationException: Please provide correct age
www.enjoyingsoft.com is not a valid email address

访问EnjoyingSoft 网站,获取更多Mule ESB实施案例技术分享。

欢迎转载,但必须保留原文和此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。