20-07-10
banq
向您演示一个小的tinyvalidator库,tinyvalidator库是执行验证流程的小型简单解决方案,该库可以在处理程序级别用于验证输入。
定义数据模型
验证从所需数据及其参数的定义开始。tinyvalidator使用基于注释的方法。
public class AuthRequest { @Email private String email; @Size(min = 8) private String password; // getters, setters } |
在此代码段中,我们使用了两个注释:@Email和@Size。第一个检查字段是否包含有效的电子邮件地址(尽管这适用于format。您需要实施电子邮件确认流程来检查此电子邮件确实存在)。第二个断言password字符串的长度不小于8。
您的API中可能还需要使用许多其他有用的内置验证器注释:
- @NotNull –检查字段是否为空
- @HttpUrl –检查字段是否包含有效的网址
- @Pattern –接受与定义的常规表达式匹配的字段
构建验证流程的第二部分实际上是调用验证器组件,该组件根据定义的规则对bean进行断言:
public void login(Context context) { Validator validator = new Validator(); AuthRequest request = context.bodyAsClass(AuthRequest.class); List<ConstraintViolation> violations = validator.validate(request); if (!violations.isEmpty()) { String message = violations.stream() .map(v -> v.getName().concat(": ").concat(v.getMessage())) .collect(Collectors.joining(", ")); throw new BadRequestResponse(message); } AuthResponse result = service.login(request); context.json(result); } public void signup (Context context){ AuthRequest request = context.bodyAsClass(AuthRequest.class); Validator validator = new Validator(); List<ConstraintViolation> violations = validator.validate(request); if (!violations.isEmpty()) { String message = violations.stream() .map(v -> v.getName().concat(": ").concat(v.getMessage())) .collect(Collectors.joining(", ")); throw new BadRequestResponse(message); } AuthResponse result = service.signup(request); context.json(result); } |
首先,我们在该方法中需要创建一个新validator实例:
Validator validator = new Validator(); |
然后,我们需要将bean传递给验证器。在我们的例子中,bean代表一个登录/注册请求(AuthRequest实体):
List<ConstraintViolation> violations = validator.validate(request); |
这种方法基本上返回一个包含验证不通过的Collection。如果bean有效,则此Collection为空。否则,我们将获得没有通过验证的字段。在这种情况下,我们需要中断带有BadRequest响应的处理程序流,然后是有关错误消息。
您可以在github存储库中找到此文章的完整源代码。