Quarkus实战:专为Kubernetes而优化的Java解决方案
上QQ阅读APP看书,第一时间看更新

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