目录
前言
在开发中,为了代码的稳定性不报空指针异常,经常需要判断前端传过来的值是否为空,为空的话就返回前端值为空的提示,才能进行下一步的操作,例如登录操作需要判断传过来的登录名和密码是否为空:
@GetMapping("login") public Result login(User user) {
if (StringUtils.isEmpty(user.getUsername())) {
return Result.fail("用户名不能为空"); } if (StringUtils.isEmpty(user.getPassword())) {
return Result.fail("密码不能为空"); } //验证密码操作省略 return Result.suc(); }
这样的话,在每次需要验证的时候,都需要判断一遍,如果参数有十多个,那岂不是要判断写十多个判断,这样不仅加大了自己的开发工作,也让代码变得冗余,@NotNull注解就很好的解决了这个问题。
@NotNull使用步骤
- 实体类需要判断的字段上面加上@NotNull注解,并且message配置提示语句
@Data public class User {
private Integer id; @NotNull(message = "用户名不能为空") private String username; @NotNull(message = "密码不能为空") private String password; private String email; private String phone; private String idCard; private Byte sex; private Byte deleted; private Date updateTime; private Date createTime; }
- controller接口的方法参数加入@Valid注解,表示当前的实体类接收的参数需要根据配置的@NotNull注解判断
@GetMapping("login") public Result login(@Valid User user) {
System.out.println("测试@notNull注解"); //验证密码操作省略 return Result.suc(); }
- 接口代码中省略判断登录名和密码是否为空,现在调一次接口测试一下

- 配置全局异常捕获
@RestControllerAdvice @Slf4j public class GlobalExceptionHandler {
@ExceptionHandler(Throwable.class) public ErrorResult handleThrowable(Throwable e, HttpServletRequest request) {
ErrorResult error =ErrorResult.fail(ResultCode.SYSTEM_ERROR, e); log.error("URL:{} ,系统异常: ",request.getRequestURI(), e); return error; } @ExceptionHandler(BindException.class) public ErrorResult exceptionHandler(BindException e, HttpServletRequest request) {
String failMsg = e.getBindingResult().getFieldError().getDefaultMessage(); ErrorResult error = ErrorResult.fail(ResultCode.SYSTEM_ERROR, e, failMsg); log.error("URL:{} ,绑定异常:{} ", request.getRequestURI(),failMsg); return error; } }

问题
- 修改User类,配置了一下username内的groups为TestNotNull.class,groups里面的class需要为接口,可以用service的接口,也可以重新创建
@Data public class User {
private Integer id; @NotNull(message = "用户名不能为空",groups = {
TestNotNull.class}) private String username; @NotNull(message = "密码不能为空") private String password; private String email; private String phone; private String idCard; private Byte sex; private Byte deleted; private Date updateTime; private Date createTime; }
- controller中,没有使用@Valid注解了,而是要使用@Validated,里面value代表的是,在User类里面@NotNull注解里面配置了groups里面有TestNotNull.class的字段判断会生效
那么当前配置的话,就只会判断username是否为空,而password因为没有配置同样的groups属性,所以不会生效
@GetMapping("test") public Result test(@Validated(value = {
TestNotNull.class}) User user) {
System.out.println("测试@notNull注解"); //验证密码操作省略 return Result.suc(); }
- 测试是否不传password参数,代码会不会抛异常

这里没有传password,代码没有抛异常,说明@Validated注解不会判断groups属性没有当前class的注解,再试一下不传username会不会抛异常

这里没有传username,返回的是用户名不能为空,说明配置成功了,如果以后开发中,在多个接口中有不同的判断体系,可以用groups的方式分组
其他注解
springboot中除了@NotNull注解外,还有其他的注解可以判断其他的格式,如下:
//被注释的元素必须为null @Null //被注释的元素不能为null @NotNull //被注释的元素必须为true @AssertTrue //被注释的元素必须为false @AssertFalse //被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Min(value) //被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @Max(value) //被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @DecimalMin(value) //被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMax(value) //被注释的元素的大小必须在指定的范围内。 @Size(max,min) //被注释的元素必须是一个数字,其值必须在可接受的范围内 @Digits(integer,fraction) //被注释的元素必须是一个过去的日期 @Past //被注释的元素必须是一个将来的日期 @Future //被注释的元素必须符合指定的正则表达式。 @Pattern(value) //被注释的元素必须是电子邮件地址 @Email //被注释的字符串的大小必须在指定的范围内 @Length //被注释的字符串必须非空 @NotEmpty //被注释的元素必须在合适的范围内 @Range
以@Email举例,在email字段上面加入@Email注解并写上提示信息
@Data public class User {
private Integer id; private String username; private String password; @Email(message = "邮箱格式不正确") private String email; private String phone; private String idCard; private Byte sex; private Byte deleted; private Date updateTime; private Date createTime; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229939.html原文链接:https://javaforall.net
