基于自定义校验注解的使用可以提高代码的可读性和可维护性,可以定义自己的业务规则并在控制器中进行验证,从而更好地保障数据的安全性。下面给出一个完整的攻略,包括自定义注解的编写、控制器中的使用、注解的分组以及两个示例。
编写自定义注解
自定义注解应该使用@Target
和@Retention
注解对其进行标记,使其可以被正确地应用到需要校验的方法上。下面是一个简单的示例:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidator.class)
public @interface CustomValidate {
String message() default "自定义校验不通过";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
在上面的代码中,我们定义了一个名为CustomValidate
的注解,并指定它可以被应用于方法和类上;注解的校验器是一个名为 MyValidator
的类。同时我们定义了三个属性,分别是message
、groups
和payload
,其中message
属性定义了校验不通过时的提示信息。其他两个属性暂不赘述,可以在需要使用时进一步了解。
编写自定义校验器
在自定义注解中,需要指定用于校验的类。这个类需要实现ConstraintValidator
接口,定义了自定义校验的规则。
下面是一个简单的示例:
public class MyValidator implements ConstraintValidator<CustomValidate, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
// 定义校验规则
return value.length() > 5;
}
}
在上面的示例中,我们定义了一个名为 MyValidator
的校验器。ConstraintValidator<CustomValidate, String>
说明了该验器可以用于验证的类型是String
,并实现了isValid
方法,具体的校验规则由程序员自行定义。
在控制器中使用自定义注解
自定义注解和校验器编写完成后,需要在控制器方法中使用注解对参数进行校验。如下面的示例:
@RestController
@RequestMapping("/customValidator")
public class CustomValidatorController {
@PostMapping("/test")
@CustomValidate(message = "用户名长度不能小于5")
public String test(@RequestParam String username) {
return "Hello " + username;
}
}
在上面的示例中,我们使用 @CustomValidate(message = "用户名长度不能小于5")
将注解应用到test
方法上。当参数username
长度小于5时,程序会返回 用户名长度不能小于5
的提示信息。
校验注解的分组
分组可以定义注解校验的优先级。我们可以使用javax.validation.groups.Default
进行默认分组的定义,也可以自定义其他分组。实现分组校验需要在定义自定义校验注解时,使用 @GroupSequence
和 @Validated
对需要校验的对象进行分组,然后在控制器方法中使用 @Validated
注解的value
属性指定需要校验的分组。
下面是一个示例:
public interface UpdateGroup {}
public interface AddGroup {}
public class User {
@NotNull(groups = {AddGroup.class, UpdateGroup.class})
private String username;
// 其他属性省略...
}
@RestController
@RequestMapping("/customValidator")
@Validated
public class CustomValidatorController {
@PostMapping("/add")
public String add(@Validated(AddGroup.class) @RequestBody User user) {
// 添加用户
return "添加成功";
}
@PostMapping("/update")
public String update(@Validated(UpdateGroup.class) @RequestBody User user) {
// 更新用户
return "更新成功";
}
}
在上面的示例中,我们定义了两个分组 AddGroup
和 UpdateGroup
,并且给 User
类的username
属性添加了@NotNull
注解,并指定了需要校验的分组(既可以校验 AddGroup
分组,也可以校验 UpdateGroup
分组)。
在控制器方法中,我们将 @Validated(AddGroup.class)
和 @Validated(UpdateGroup.class)
作为方法参数 user
的注解,说明需要校验的分组。当 user
中的某个属性未能通过校验时,控制器会返回相应的提示信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于自定义校验注解(controller、method、(groups)分组的使用) - Python技术站