0

我有一个包含依赖项的 Java 应用程序。该依赖项是一个 Java 库,它提供:

  • 一种javax.validation.Validator
  • 一组可用于验证的注释,以及它们相关javax.validation.ConstraintValidator
  • 属性文件中自己的一组验证错误消息
  • 一些需要验证的领域模型 POJO

该应用程序使用库的验证器来验证库的 POJO。到现在为止还挺好。但是该应用程序还编写了一个新的 POJO,其中包含库的 POJO 作为字段(嵌套 POJO)。由库的 POJO 组成的应用程序的 POJO 需要验证,因此应用程序在属性文件中也有自己的验证消息。(在验证一个 Java 对象时,我们可能需要来自库应用程序的验证消息)。

private static final ValidatorFactory FACTORY = Validation.byDefaultProvider()
  .configure()
  .messageInterpolator(new ResourceBundleMessageInterpolator(
      new PlatformResourceBundleLocator("MyLibraryValidationMessages")))
  .buildValidatorFactory();

如何验证包含ConstraintValidators引用来自两个不同资源包的消息的注释(及其关联的)的单个 POJO(其中包含嵌套的 POJO)?需要:Validator从两个不同的资源包获取消息。没有使用弹簧。

我们可能根本不需要使用属性文件中的资源包,因为我们不需要为不同的语言环境进行单独的消息翻译。对于每个错误,我们只需要一条默认消息。如果我们可以将所有消息存储在代码中,那能提供一种解决方法吗?

我尚未尝试但我认为可行的一种解决方法是确保库和应用程序中的资源包名称完全相同,并将所有消息从 sdk 复制/复制到应用程序的资源包中,因为如果它们使用相同的名称,则应用程序的包将隐藏库的包。但由于错误消息的重复,这是次优的。

我控制依赖项和应用程序的代码。

4

1 回答 1

0

我刚刚发现AggregateResourceBundleLocator应该做的工作:

 private static final ValidatorFactory FACTORY = Validation.byDefaultProvider()
  .configure()
  .messageInterpolator(new ResourceBundleMessageInterpolator(
      new AggregateResourceBundleLocator(
          Arrays.asList("MyLibraryValidationMessages", "MyAppValidationMessages"))))
  .buildValidatorFactory();
于 2021-09-29T20:23:28.290 回答