gpt4 book ai didi

java - 通过 "mixins"验证

转载 作者:行者123 更新时间:2023-11-30 01:58:09 29 4
gpt4 key购买 nike

我正在 Spring Boot 2+ 中开发 RESTful API,为此我需要执行多次验证。没什么特别的,只是典型的 @NotNull@NotEmpty@Max@Min @Email@Regex@Future 等等……

除了我有来自 API 的 Bean,我必须使用但无法修改。这意味着我无法注释这些 DTO 中的字段和方法。

如果我能够创建与我必须在 API 中使用的真实 DTO 具有相同结构的类或接口(interface),那就太好了,我很乐意在其上放置 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
}

我将创建以下两个界面来模仿它们的结构并根据需要对它们进行注释:

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
}

如您所见,接口(interface)中的方法名称与 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 序列化/反序列化。我多次发现它非常有用。

现在,我一直在查看 Spring 和 Hibernate Validator 的源代码。但这不是小菜一碟...我已经深入研究了 ValidatorFactory、LocalValidatorFactoryBean、TraversableResolver 实现,但我还没有能够甚至开始概念验证。有人能解释一下吗? IE。不是如何实现整个功能,而是如何以及从哪里开始。我正在寻找一些关于哪些是要扩展和/或实现的基本类或接口(interface)、要重写哪些方法等的提示。

<小时/>

编辑1:也许这种方法不是最好的方法。如果您认为有更好的方法,请告诉我。

<小时/>

编辑2:至于这种方法过于复杂、过于复杂,Rube Goldberg等,我欣赏并尊重这些观点,但我不询问通过 mixins 进行验证是好还是坏、方便还是不方便,也不知道为什么会这样。通过 mixins 进行验证本身就有优点,我认为对于某些有效用例来说,这可能是一种很好的方法,即使用声明性验证而不是脚本化或编程验证,同时还将验证与模型分开,让底层框架完成实际的验证工作而我只指定约束等。

最佳答案

使用programmatic API (如评论中所述)如果是 Person,您可以为您的约束应用下一个映射:

    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 时 - 您需要在定义 validator bean 的 sping 配置文件之一中执行此操作。

关于java - 通过 "mixins"验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53714567/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com