返回

优雅而不冗余的Java参数校验方式

后端

分层验证

分层验证模型是传统的校验模式,即每一层都添加数据验证。这种方式的优点是简单易懂,缺点是验证逻辑重复性大,会出现冗余代码过多的情况。

例如,假设我们有一个用户注册的接口,需要对用户的姓名、密码和邮箱进行验证。使用分层验证模型,我们可以这样实现:

public class UserRegisterController {

    @PostMapping("/register")
    public ResponseEntity<String> register(@RequestBody User user) {
        // 验证姓名
        if (user.getName() == null || user.getName().isEmpty()) {
            return ResponseEntity.badRequest().body("姓名不能为空");
        }
        // 验证密码
        if (user.getPassword() == null || user.getPassword().isEmpty()) {
            return ResponseEntity.badRequest().body("密码不能为空");
        }
        // 验证邮箱
        if (user.getEmail() == null || user.getEmail().isEmpty()) {
            return ResponseEntity.badRequest().body("邮箱不能为空");
        }
        // 保存用户
        userService.save(user);
        return ResponseEntity.ok("注册成功");
    }
}

从上面的代码可以看出,我们对用户的姓名、密码和邮箱进行了三次验证,这显然是重复的。如果我们使用JavaBean验证,就可以避免这种重复。

JavaBean验证

JavaBean验证是一种基于注解的验证框架,它可以对JavaBean的属性进行验证。使用JavaBean验证,我们可以这样实现用户注册的接口:

public class User {

    @NotBlank(message = "姓名不能为空")
    private String name;

    @NotBlank(message = "密码不能为空")
    private String password;

    @Email(message = "邮箱格式不正确")
    private String email;

    // 省略其他属性和方法
}

public class UserRegisterController {

    @PostMapping("/register")
    public ResponseEntity<String> register(@RequestBody User user) {
        // 使用Hibernate Validator进行验证
        Set<ConstraintViolation<User>> violations = validator.validate(user);
        if (violations.isEmpty()) {
            // 保存用户
            userService.save(user);
            return ResponseEntity.ok("注册成功");
        } else {
            // 返回验证错误信息
            return ResponseEntity.badRequest().body(violations.iterator().next().getMessage());
        }
    }
}

从上面的代码可以看出,我们只需要在用户的属性上添加相应的注解,就可以对用户的属性进行验证。这不仅避免了重复的验证逻辑,而且还使代码更加简洁。

更优雅的Java参数验证方式

分层验证和JavaBean验证都是常用的Java参数验证框架,但它们都存在一些缺点。分层验证的缺点是验证逻辑重复性大,JavaBean验证的缺点是需要在属性上添加注解。

为了避免这些缺点,我们可以使用一种更优雅的Java参数验证方式,那就是使用参数校验框架。参数校验框架可以对方法的参数进行验证,它可以自动生成验证逻辑,并对不合法的数据抛出异常。

例如,我们可以使用JSR-303 Bean Validation API来实现用户注册的接口:

public class User {

    // 省略属性和方法
}

public class UserRegisterController {

    @PostMapping("/register")
    public ResponseEntity<String> register(@Valid @RequestBody User user) {
        // 使用JSR-303 Bean Validation API进行验证
        userService.save(user);
        return ResponseEntity.ok("注册成功");
    }
}

从上面的代码可以看出,我们只需要在方法的参数上添加@Valid注解,就可以对方法的参数进行验证。这不仅避免了重复的验证逻辑,而且还使代码更加简洁。

使用参数校验框架的好处有很多,比如:

  • 简化代码:参数校验框架可以自动生成验证逻辑,这可以简化我们的代码。
  • 提高代码质量:参数校验框架可以帮助我们发现代码中的错误,这可以提高我们的代码质量。
  • 增强安全性:参数校验框架可以防止不合法的数据进入系统,这可以增强我们的系统安全性。

因此,在Java中进行参数验证,我们推荐使用参数校验框架。