Java 接口请求对象 校验参数为空高级写法
时间: 2023-09-22 17:06:43 浏览: 51
在 Java 中,使用注解进行参数校验是一种常见的做法。如果需要实现高级写法,可以使用 Hibernate Validator 库中的 ConstraintValidator 接口和自定义注解来实现参数校验。
示例代码如下:
1. 创建自定义注解
```
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NotEmptyValidator.class)
public @interface NotEmpty {
String message() default "参数不能为空";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
```
在上面的代码中,定义了一个 NotEmpty 注解,用于校验参数非空。其中,@Constraint 注解用于指定校验逻辑的实现类 NotEmptyValidator。
2. 创建校验器
```
public class NotEmptyValidator implements ConstraintValidator<NotEmpty, Object> {
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
if (value instanceof String) {
return StringUtils.isNotBlank((String) value);
}
if (value instanceof Collection) {
return !((Collection<?>) value).isEmpty();
}
if (value instanceof Map) {
return !((Map<?, ?>) value).isEmpty();
}
if (value.getClass().isArray()) {
return Array.getLength(value) > 0;
}
return true;
}
}
```
在上面的代码中,创建了 NotEmptyValidator 类,实现了 ConstraintValidator 接口。isValid 方法用于实现校验逻辑,它可以判断不同类型的参数是否为空。
3. 在接口请求对象中使用注解
```
public class UserQuery {
@NotEmpty(message = "用户名不能为空")
private String username;
@NotEmpty(message = "角色列表不能为空")
private List<Role> roles;
// 其他字段略
// getter 和 setter 略
}
```
在上面的代码中,使用 NotEmpty 注解来标记 username 和 roles 字段,表示它们不能为空。如果校验失败,会抛出异常并返回错误信息。
4. 在 Controller 中进行参数校验
```
@PostMapping("/users")
public ResponseEntity<List<User>> listUsers(@RequestBody @Validated UserQuery query) {
List<User> users = userService.listUsers(query);
return ResponseEntity.ok(users);
}
```
在上面的代码中,使用 @Validated 注解来开启参数校验功能,并将 UserQuery 对象标记为需要进行校验。如果校验失败,会抛出异常并返回错误信息。
使用上述方法,可以在接口请求对象中使用注解来进行参数校验,而不需要在 Controller 中编写大量的校验代码,从而提高代码可读性和可维护性。