通过 "mixins" 验证
Validation through "mixins"
我正在 Spring Boot 2+ 中开发 RESTful API,为此我需要执行多项验证。没什么特别的,只是典型的 @NotNull
、@NotEmpty
、@Max
、@Min
、@Email
、@Regex
、@Future
等东西...
除了我有来自 API 的 bean,我 必须使用但不能修改 。这意味着我无法注释那些 DTO 中的字段和方法。
如果我可以创建 mixin-like 类 或与我必须在 [=65= 中使用的真实 DTO 相同结构的接口,那就太好了], 我很乐意在上面放置 bean-validation 的注释。
例如,如果我有以下无法修改的 DTO:
public class Person {
private String name;
private String dateOfBirth;
private Address address;
// constructors, getters and setters ommited
}
public class Address {
private String street;
private String number;
private String zipCode;
// constructors, getters and setters ommited
}
我将创建以下 2 个接口来模仿它们的结构并根据需要对其进行注释:
public interface PersonMixin {
@NotBlank String name();
@Past String dateOfBirth();
@Valid @NotNull Address address();
}
public interface AddressMixin {
@NotBlank String street();
@Positive int number();
@NotBlank String zipCode(); // Or maybe a custom validator
}
如您所见,接口中方法的名称与 bean 属性的名称匹配 类。这只是一种可能的约定...
然后,理想情况下,在应用程序加载时的某处(通常是一些 @Configuration
bean)我会很乐意按照以下方式做一些事情:
ValidationMixinsSetup.addMixinFor(Person.class, PersonMixin.class);
ValidationMixinsSetup.addMixinFor(Address.class, AddressMixin.class);
除了 ValidationMixinsSetup.addMixinFor
是纯粹的幻想,即它不存在。
我知道 there exists a similar construct for Jackson 关于 JSON serialization/deserialization。我多次发现它非常有用。
现在,我一直在查看 Spring 和 Hibernate Validator 的源代码。但这不是小菜一碟......我已经深入研究了 ValidatorFactory
、LocalValidatorFactoryBean
、TraversableResolver
实现,但我什至无法开始概念验证.任何人都可以对此有所了解吗? IE。不是如何实现整个功能,而是如何以及从哪里开始。我正在寻找一些关于哪些是基本 类 或扩展 and/or 实现的接口,哪些方法要覆盖等的提示。
编辑 1: 也许这种方法不是最好的方法。如果您认为有更好的方法,请告诉我。
编辑 2: 至于这种方法过于复杂,过于复杂,Rube Goldberg 等,我欣赏并尊重这些观点的观点,但我不是在问通过混入的验证是好是坏,方便还是不方便,也不是为什么会这样。通过 mixin 进行的验证有其自身的优点,我认为这对于某些有效用例来说可能是一种很好的方法,即使用声明式验证而不是脚本或程序验证,同时还将验证与模型分开,让底层框架完成实际的验证工作而我只指定约束等
在 Person 的情况下使用 programmatic API(如评论中所述),您可以为您的约束应用下一个映射:
HibernateValidatorConfiguration config = Validation.byProvider( HibernateValidator.class ).configure();
ConstraintMapping mapping = config.createConstraintMapping();
mapping.type( Person.class )
.field( "name" )
.constraint( new NotNullDef() )
.field( "number" )
.constraint( new PositiveDef() )
.field( "address" )
.constraint( new NotNullDef() )
.valid();
Validator validator = config.addMapping( mapping )
.buildValidatorFactory()
.getValidator();
当您使用 Spring - 您需要在定义验证器 bean 的一个 sping 配置文件中执行此操作。
我正在 Spring Boot 2+ 中开发 RESTful API,为此我需要执行多项验证。没什么特别的,只是典型的 @NotNull
、@NotEmpty
、@Max
、@Min
、@Email
、@Regex
、@Future
等东西...
除了我有来自 API 的 bean,我 必须使用但不能修改 。这意味着我无法注释那些 DTO 中的字段和方法。
如果我可以创建 mixin-like 类 或与我必须在 [=65= 中使用的真实 DTO 相同结构的接口,那就太好了], 我很乐意在上面放置 bean-validation 的注释。
例如,如果我有以下无法修改的 DTO:
public class Person {
private String name;
private String dateOfBirth;
private Address address;
// constructors, getters and setters ommited
}
public class Address {
private String street;
private String number;
private String zipCode;
// constructors, getters and setters ommited
}
我将创建以下 2 个接口来模仿它们的结构并根据需要对其进行注释:
public interface PersonMixin {
@NotBlank String name();
@Past String dateOfBirth();
@Valid @NotNull Address address();
}
public interface AddressMixin {
@NotBlank String street();
@Positive int number();
@NotBlank String zipCode(); // Or maybe a custom validator
}
如您所见,接口中方法的名称与 bean 属性的名称匹配 类。这只是一种可能的约定...
然后,理想情况下,在应用程序加载时的某处(通常是一些 @Configuration
bean)我会很乐意按照以下方式做一些事情:
ValidationMixinsSetup.addMixinFor(Person.class, PersonMixin.class);
ValidationMixinsSetup.addMixinFor(Address.class, AddressMixin.class);
除了 ValidationMixinsSetup.addMixinFor
是纯粹的幻想,即它不存在。
我知道 there exists a similar construct for Jackson 关于 JSON serialization/deserialization。我多次发现它非常有用。
现在,我一直在查看 Spring 和 Hibernate Validator 的源代码。但这不是小菜一碟......我已经深入研究了 ValidatorFactory
、LocalValidatorFactoryBean
、TraversableResolver
实现,但我什至无法开始概念验证.任何人都可以对此有所了解吗? IE。不是如何实现整个功能,而是如何以及从哪里开始。我正在寻找一些关于哪些是基本 类 或扩展 and/or 实现的接口,哪些方法要覆盖等的提示。
编辑 1: 也许这种方法不是最好的方法。如果您认为有更好的方法,请告诉我。
编辑 2: 至于这种方法过于复杂,过于复杂,Rube Goldberg 等,我欣赏并尊重这些观点的观点,但我不是在问通过混入的验证是好是坏,方便还是不方便,也不是为什么会这样。通过 mixin 进行的验证有其自身的优点,我认为这对于某些有效用例来说可能是一种很好的方法,即使用声明式验证而不是脚本或程序验证,同时还将验证与模型分开,让底层框架完成实际的验证工作而我只指定约束等
在 Person 的情况下使用 programmatic API(如评论中所述),您可以为您的约束应用下一个映射:
HibernateValidatorConfiguration config = Validation.byProvider( HibernateValidator.class ).configure();
ConstraintMapping mapping = config.createConstraintMapping();
mapping.type( Person.class )
.field( "name" )
.constraint( new NotNullDef() )
.field( "number" )
.constraint( new PositiveDef() )
.field( "address" )
.constraint( new NotNullDef() )
.valid();
Validator validator = config.addMapping( mapping )
.buildValidatorFactory()
.getValidator();
当您使用 Spring - 您需要在定义验证器 bean 的一个 sping 配置文件中执行此操作。