在Mule 4中使用Mule SDK进行自定义验证的教程

150 阅读4分钟

在Mule 4中使用Mule SDK进行自定义验证

Mule中的自定义验证

验证器是在不改变消息的情况下验证Mule消息的操作。验证器可以产生这些效果:

  • 如果验证器要求的条件被满足,流程继续,Mule消息保持不变。
  • 如果验证器要求的条件没有得到满足,就会产生一个错误。

今天我们将创建一个自定义的验证器,来验证一个货币是否有效。

前提条件

创建自定义验证器的步骤

  • **创建项目。**进入你的项目文件夹,运行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类。这些文件将被用于自定义连接器。
    • CurrencyValidatorConfiguration
    • CurrencyValidatorConnection
    • CurrencyValidatorConnectionProvider
    • CurrencyValidatorOperationsTestCase
  • 货币依赖。在 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_CODE

    public 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

github.com/shyamrajpra…

总结

今天我们已经学会了如何使用Mule JAVA SDK开发Mule自定义验证。在未来的教程中,我将介绍Mule SDK的REST API。