
5.3 校验输入值和输出值
问题
如何校验REST服务或项目服务的输入值和输出值的合法性?
解决方案
使用Bean Validation规范来为你的模型添加校验。
通常,你的模型中可能包含一些约束来校验模型是否在语义上有效。例如,名字不能为空,或者一个电子邮件是一个有效的电子邮件。Quarkus与Bean Validation集成,通过注解来表达对象模型上的约束。
首先,在pom.xml中添加Bean Validation扩展。打开一个终端窗口,在项目的根目录下运行以下命令:
这可以快速将io.quarkus:quarkus-hibernate-validator添加到构建工具中。
在Gradle中,你可以使用./gradlew addExtension --extensions="quarkus-hibernate-validator"来添加扩展。
下一步是更新developer类,添加一些约束条件的注解。打开org.acme.quickstart.Developer.java类,并对一些字段添加注解:
❶字符串的最小长度为4
❷字段是强制性的
任何一个可用的包都能完成这样的功能,但如果你只想使用规范的API,请使用javax包。
最后,你需要用javax.validation.Valid注解来标识某一个参数需要校验。打开org.acme.quickstart.DeveloperResource.java类,并对develop参数添加注解:
❶@Valid是校验对象的强制参数
打开一个新的终端窗口,启动Quarkus应用程序,然后执行POST方法请求:
注意,在第一个请求中,name的长度不合法,因此返回了一个400 Bad Request HTTP状态码。在第二个请求中,请求体是合法的,所以返回是符合预期的。
但是请注意,如果出现错误,响应体中并不包含任何关于失败的信息。这样做的好处是不会直接显示内部结构,而是以一种可控的方式显示。
讨论
如果你想提供一个更友好的响应体,可以提供一个ExceptionMapper的实现。
创建一个名为org.acme.quickstart.BeanValidationExceptionMapper.java的新类:
❶@Provider设置了一个可由JAX-RS运行时发现的扩展接口实现
❷javax.ws.rs.ext.ExceptionMapper用于将异常转化为一个javax.ws.rs.core.Response
❸创建违反约束的数组
❹对每一个违反约束条件进行迭代
❺创建JSON对象
现在你可以再次发送POST方法的请求:
现在的输出略有不同,但错误代码还是一样的:400 Bad Request,但是响应体的内容包含了我们在异常映射器中创建的JSON文档。
你也可以通过在返回类型中添加@Valid注解来验证输出参数(你发回给调用者的参数):
此外,有时你不想在请求接口中添加校验规则,而想在业务服务层中添加。如果你使用CDI的方式,可以在业务服务中使用Bean Validation。请看下面的例子:
另见
如果你想了解关于Bean Validation的更多信息,以及默认情况下实现了哪些约束条件(如@Min、@Max、@AssertTrue、@Email等),可以访问以下网站。
·Jakarta Bean Validation(https://oreil.ly/YHR_X)