
5.4 创建自定义校验
问题
如何创建自定义校验?
解决方案
通过实现javax.validation.ConstraintValidator接口来使用Bean Validation扩展模型。
有时,Bean Validation规范提供的默认约束是不够的,需要实现与业务模型更紧密结合的约束。Bean Validation允许通过创建一个类来实现此目的,该类实现javax.validation.ConstraintValidator接口和注解——用于注解要验证的字段。
让我们看一个例子,假如你最喜欢的语言只能是基于JVM的语言。首先,你需要创建注解。创建一个名为org.acme.quick start.JvmLanguage.java的新类:
❶将约束条件作为正常的编译错误抛出
然后你需要创建逻辑来检测约束与否违反。这个新的类必须实现javax.validation.ConstraintValidator接口。
接下来,创建一个名为org.acme.quickstart.JvmLanguageValidator.java的类:
❶上一步定义的注解
❷适用于验证的对象类型
❸检查所提供的最喜欢的语言(value)是否是基于JVM的语言
最后,你需要注解org.acme.quick start.Developer中的favoriteLanguage字段:
打开一个新的终端窗口,启动Quarkus应用程序,然后尝试用POST方法发送一些请求:
讨论
REST端点、服务方法以及任何CDI作用域内对象上,任何遵循Bean Validation规范的验证都将在应用程序运行期间自动执行。如果你需要更多的控制,请看5.5节,该节介绍了校验对象的其他方法。
同样值得一提的是,默认情况下,违反约束的信息将使用系统语言返回。如果你想改变这个设置,可以在application.properties文件中通过设置quarkus.default-locale来实现:
对于REST端点,本地化将基于Accept-Language HTTP头实现。你可以在application.properties文件中指定支持的语言列表:
另见
关于更多信息,请访问以下网站:
·Jakarta Bean Validation(https://oreil.ly/R6L4d)
·Hibernate Validator(https://oreil.ly/O7BNR)