在Mule 4中使用Mule SDK进行自定义验证
Mule中的自定义验证
验证器是在不改变消息的情况下验证Mule消息的操作。验证器可以产生这些效果:
- 如果验证器要求的条件被满足,流程继续,Mule消息保持不变。
- 如果验证器要求的条件没有得到满足,就会产生一个错误。
今天我们将创建一个自定义的验证器,来验证一个货币是否有效。
前提条件
- JDK 1.8或JDK 11
- Apache Maven(最低3.3.9)。
创建自定义验证器的步骤
- **创建项目。**进入你的项目文件夹,运行Maven命令,为Mule验证器扩展生成项目。
mvn org.mule.extensions:mule-extensions-archetype-maven-plugin:1.2.0:generate
> mvn org.mule.extensions:mule-extensions-archetype-maven-plugin:1.2.0:generate
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- mule-extensions-archetype-maven-plugin:1.2.0:generate (default-cli) @ standalone-pom ---
* Enter the name of the extension (empty for default):
Mule Currency Validator
* Enter the extension's groupId (empty for default):
org.shyam.mule.extension
* Enter the extension's artifactId (empty for default):
mule-currency-validator
* Enter the extension's version (empty for default):
1.0.0
* Enter the extension's main package (empty for default):
currency
[INFO] Generating project in Batch mode
[INFO] Archetype repository not defined. Using the one from [org.mule.extensions:mule-extensions-archetype:1.2.0] found in catalog remote
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: mule-extensions-archetype:1.2.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: mule-currency-validator
[INFO] Parameter: artifactId, Value: mule-currency-validator
[INFO] Parameter: version, Value: 1.0.0
[INFO] Parameter: package, Value: currency
[INFO] Parameter: packageInPathFormat, Value: currency
[INFO] Parameter: extensionNameNoSpaces, Value: Mulecurrencyvalidator
[INFO] Parameter: extensionName, Value: Mule-currency-validator
[INFO] Parameter: package, Value: currency
[INFO] Parameter: groupId, Value: mule-currency-validator
[INFO] Parameter: artifactId, Value: mule-currency-validator
[INFO] Parameter: version, Value: 1.0.0
[WARNING] Don't override file /Users/shyamrajprasad/mule/mule-currency-validator/src/main/java/currency
[WARNING] Don't override file /Users/shyamrajprasad/mule/mule-currency-validator/src/test/java/currency
[WARNING] Don't override file /Users/shyamrajprasad/mule/mule-currency-validator/src/test/resources
[INFO] Project created from Archetype in dir: /Users/shyamrajprasad/mule/mule-currency-validator
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 55.274 s
[INFO] Finished at: 2022-06-12T20:19:28+05:30
[INFO] ------------------------------------------------------------------------
- 删除连接器配置。删 除下面四个Java类。这些文件将被用于自定义连接器。
CurrencyValidatorConfigurationCurrencyValidatorConnectionCurrencyValidatorConnectionProviderCurrencyValidatorOperationsTestCase
- 货币依赖。在
pom.xml,为货币添加以下依赖项。
<dependencies>
<dependency>
<groupId>org.javamoney</groupId>
<artifactId>moneta</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
- CurrencyValidatorExtension。这是一个货币验证器扩展类。在这个类中添加以下几行。
@Xml(prefix = "currency-validator")
@Extension(name = "Currency Validator")
@ErrorTypes(CurrencyError.class)
@Operations(CurrencyValidatorOperations.class)
public class CurrencyValidatorExtension {
}
- CurrencyValidatorOperations。 下面的
CurrencyValidatorOperations类添加了一个验证方法,该方法被注释为@Validator。该方法抛出的错误类型来自于通用验证错误类型。请注意,你也可以用@Validator来注解这个类CurrencyValidatorOperations,但是如果你这样做,其中的任何其他操作都会被标记为验证器。
public class CurrencyValidatorOperations {
@Validator
@Throws(CurrencyErrorsProvider.class)
public void isValidCurrencyCode(String currencyCode) throws Exception {
Collection<CurrencyUnit> currencyUnits= Monetary.getCurrencies();
Set<String> currencyCodes = new HashSet<String>();
for (CurrencyUnit c : currencyUnits) {
currencyCodes.add(c.getCurrencyCode());
}
if(!currencyCodes.contains(currencyCode)) {
throw new ModuleException(CurrencyError.INVALID_CURRENCY_CODE, new IllegalArgumentException("Invalid currency : " + currencyCode));
}
}
}
-
CurrencyError。 这是创建货币验证失败时要抛出的错误。请注意,它是根据验证失败来命名的。
public enum CurrencyError implements ErrorTypeDefinition<CurrencyError> { INVALID_CURRENCY_CODE(MuleErrors.VALIDATION); private ErrorTypeDefinition<? extends Enum<?>> parent; CurrencyError(ErrorTypeDefinition<? extends Enum<?>> parent) { this.parent = parent; } @Override public Optional<ErrorTypeDefinition<? extends Enum<?>>> getParent() { return Optional.ofNullable(parent); } } -
CurrencyErrorsProvider。 验证器方法需要一个
ErrorTypeProvider,它知道验证可以抛出的所有错误类型。这个例子创建了一个ErrorTypeProvider,说明该方法唯一可以抛出的错误类型是CURRENCY-VALIDATOR:INVALID_CURRENCY_CODEpublic class CurrencyErrorsProvider implements ErrorTypeProvider { @Override public Set<ErrorTypeDefinition> getErrorTypes() { HashSet<ErrorTypeDefinition> errors = new HashSet<>(); errors.add(CurrencyError.INVALID_CURRENCY_CODE); return errors; } } -
验证器图标: 进入项目根目录,创建一个图标文件夹。在该文件夹中放置一个SVG文件图像,图标文件名应该是
icon.svg。 -
Maven构建。 转到项目目录,运行终端。运行
mvn clean install,构建该项目。
如何在Mule应用程序中使用自定义验证器
- 创建一个Mule应用程序。 进入Anypoint Studio并创建一个Mule应用程序来测试自定义验证。
- 添加自定义验证器的Mule插件。 去
pom.xml,为货币的自定义验证器Mule插件添加依赖性。确保你已经添加了分类器为mule-plugin,依赖信息将来自Mule SDK验证器。
<dependency>
<groupId>org.shyam</groupId>
<artifactId>mule-currency-validator</artifactId>
<version>1.0.1</version>
<classifier>mule-plugin</classifier>
</dependency>
- HTTP监听器。 在测试的Mule应用程序中添加一个默认配置的HTTP监听器。
- 货币验证。拖 动货币验证并传递货币。我们正在从查询参数中读取货币。
<currency-validator:is-valid-currency-code doc:name="Is valid currency code" doc:id="e9b8a803-ef0f-437e-b337-e33eb5cfc614" currencyCode="#[attributes.queryParams.currencyCode]"/>
- 验证执行失败。下面是Mule应用中无效货币的错误日志。
ERROR 2022-06-12 22:52:37,285 [[MuleRuntime].uber.01: [helloworldtesting].currencyValidatoFlow.CPU_LITE @398d10a9] [processor: currencyValidatoFlow/processors/0; event: 4132b1b0-ea74-11ec-bf77-f84d89960c47] org.mule.runtime.core.internal.exception.OnErrorPropagateHandler:
********************************************************************************
Message : Invalid currency : RUPEE
Element : currencyValidatoFlow/processors/0 @ helloworldtesting:helloworldtesting.xml:48 (Is valid currency code)
Element DSL : <currency-validator:is-valid-currency-code doc:name="Is valid currency code" doc:id="467879a6-8c4c-49be-93bd-f510a029e842" currencyCode="#[attributes.queryParams.currency]"></currency-validator:is-valid-currency-code>
Error type : CURRENCY-VALIDATOR:INVALID_CURRENCY_CODE
FlowStack : at currencyValidatoFlow(currencyValidatoFlow/processors/0 @ helloworldtesting:helloworldtesting.xml:48 (Is valid currency code))
(set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************
-
Curl命令。
curl --location --request GET 'localhost:8081/currency?currency=RUPEE' -
成功执行。如 果我们传入正确的货币,我们将得到没有验证错误和响应的货币INR。curl命令是。
curl --location --request GET 'localhost:8081/currency?currency=INR'
Github Repository for Mule Custom Validation
总结
今天我们已经学会了如何使用Mule JAVA SDK开发Mule自定义验证。在未来的教程中,我将介绍Mule SDK的REST API。