jackson Bean验证和一致值对象

hof1towb  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(69)

我正在为当前的项目使用域驱动设计,这是一个基于Java的Sping Boot REST-API。因此,创建不一致的值对象应该是不可能的,我的问题就在这里。
我想实现bean验证,为我的消费者提供明确的错误响应。但是,bean验证不能验证所有必需字段,因为这个过程将被值对象的已经存在的构造函数验证中断。如果传递了无效数据,则会抛出异常,bean验证过程将立即结束。
我的值对象中的构造函数验证是强制性的,不能删除。
(我在类级别上使用@Validated,在复杂对象上使用@Valid,以及@Pattern/NotNull...原始构造函数参数)
一种可能的解决方案是在反序列化期间使用自定义反序列化器和值对象的默认构造函数来创建不一致的值对象。
不幸的是,我不知道如何实现这一点。如何在此场景中触发bean验证?

7uhlpewt

7uhlpewt1#

我在这里看到的问题是你的请求与域对象的验证混合在一起。
您应该将表示域对象的bean的业务逻辑与从外部世界传入的数据分开。
举例来说:
你需要一个数据集,它在一个请求对象中传入你的控制器。它可以被JsonMap到Java对象。这个对象可以通过jakarta库进行验证。在这里,您可以检查@NonNull、@SomeOther字段验证。
当在流程的这一部分验证错误时,您可以创建一个带有验证错误的响应。
请记住,这是请求数据的错误,而不是域bean或进程。
当请求数据在下一步中被正确验证时,您应该将此请求传递给工厂/构造器以创建域对象,或者您应该创建一个带有进程处理程序数据的命令。
在创建之前,应根据定义的DOMAIN规则验证此域对象或命令。
我提出了我的解决方案。这也可以用另一种方法来做,但我认为这是最简单的方法。
你也可以看看这个github repo:https://github.com/krzysztofslusarski/jug-hex其中实际上显示为ddd(没有restAPI,但这只是一个输入接口,因此可以用其他东西代替)。

kgqe7b3p

kgqe7b3p2#

如果它是一个选项,不要使用bean验证。
我喜欢我的对象具有“零时间无效状态”,所以所有的东西都在构造函数中进行验证。

相关问题