在java开发中,springboot几乎已经是开发web项目的脚手架了。在这些web接口里面,我们经常会涉及到接收json字样,那么整个json字段非常多,我们是否需要写很多if-else来挨个对参数进行判断呢? 其实不然,我们可以直接使用hibernate-validator注解在model里面进行参数的校验即可。下面直接实战下
1、新创建一个maven项目,并且添加如下依赖:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.1.Final</version> </dependency>
2、新建一个DTO的类,我们假设这里是一个user的dto,则代码如下:
package com.sms.demo.dto; import java.io.Serializable; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.Length; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @ToString public class UserDTO implements Serializable { /** * */ private static final long serialVersionUID = -3951166342372814392L; @NotNull(message = "请输入用户姓名") @Length(min = 2, max = 20, message = "姓名长度最大不能超过20") private String userName; @NotNull(message = "请输入用户年龄") @Max(value = 100, message = "用户年龄不能超过100岁") @Min(value = 18,message = "当前用户还未成年") private String userAge; }
从上面我们可以看出,我们只需要在每一个字段里面添加我们的注解即可,这些注解里面标注了condition,同时也标注了对应的错误信息。
3、编写一个controller,在requestBody的地方添加一个 @Validated注解即可,例如:
@RequestMapping("/adduser") public String addUser(@RequestBody @Validated UserDTO user) { return "ok"; }
4、运行一下,访问接口查看结果:
从上面我们可以看到对应的字段进行了判断,但是返回信息是不是不是我们想要的,我们一般在返回的类里面都是定义了标准的返回json,例如:
{ "code": 402, "message": "请输入用户年龄", "data": null }
这样子的话,方便我们客户端对json进行解析,那要怎么做呢?其实就是在全局异常的地方添加一个拦截方法
@ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(code = HttpStatus.OK) public BaseResponse methodArgumentNotValidException(MethodArgumentNotValidException ex) { log.error(ex.getMessage(), ex); BindingResult bindingResult = ex.getBindingResult(); String defaultMessage = bindingResult.getFieldError().getDefaultMessage(); return BaseResponse.fail(402,defaultMessage); }
此时我们再运行下看看结果:
可以看到这就是我们想要的结果了。
在这里补充下hibernate-validator这个框架所涉及到哪些判断方法:
序号 | 注解 | 说明 |
1 | @valid | 被注释的元素是一个对象,需要检查此对象的所有字段值 |
2 | @Null | 被注释的元素必须为 null |
3 | @NotNull | 被注释的元素必须不为 null |
4 | @AssertTrue | 被注释的元素必须为 true |
5 | @AssertFalse | 被注释的元素必须为 false |
6 | @Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
7 | @Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
8 | @DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
9 | @DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
10 | @Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
11 | @Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
12 | @Past | 被注释的元素必须是一个过去的日期 |
13 | @Future | 被注释的元素必须是一个将来的日期 |
14 | @Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
15 | 被注释的元素必须是电子邮箱地址 | |
16 | @Length(min=, max=) | 被注释的字符串的大小必须在指定的范围内 |
17 | @NotEmpty | 被注释的字符串的必须非空 |
18 | @Range(min=, max=) | 被注释的元素必须在合适的范围内 |
19 | @NotBlank | 被注释的字符串的必须非空 |
20 | @URL(protocol=,host=, port=, regexp=, flags=) | 被注释的字符串必须是一个有效的url |
21 | @CreditCardNumber | 被注释的字符串必须通过Luhn校验算法, 银行卡,信用卡等号码一般都用Luhn 计算合法性 |
22 | @ScriptAssert(lang=, script=, alias=) | 要有Java Scripting API 即JSR 223 ("Scripting for the JavaTM Platform")的实现 |
23 | @SafeHtml(whitelistType=, additionalTags=) | classpath中要有jsoup包 |
上面的注解大家根据实际情况使用即可。最后按照惯例,附上本demo的代码,登录后即可看到。
还没有评论,来说两句吧...