当我们进行Java Bean校验时,通常会使用Hibernate提供的校验框架。Valid和Validated是该框架中最常用的两种表单验证注解,它们都是用于指定校验组,在校验时都可以用来限制哪些校验组中的校验规则生效。但是,它们有一些区别。下面我将详细讲解Java中Valid和Validated的比较内容,帮助读者理解它们的使用方法。
Valid注解
@Valid
注解通常作用于Java Bean中的字段中,用于标示要对该字段进行校验。如果该字段是一个复杂类型的对象,那么在校验该对象时,也会对该对象中所有需要校验的字段进行递归校验。@Valid
注解还可以用于标识一个方法参数,例如:
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String addUser(@RequestBody @Valid UserDTO userDTO) {
// do something
}
在上述代码中,UserDTO是一个Java Bean,它作为方法的参数提交,请求体中的数据将自动转换成一个UserDTO对象。其中,使用了@Valid
注解对UserDTO对象进行校验。
Validated注解
@Validated
注解作用于类或方法上,用于标识一个校验规则组。当需要使用混合多个校验注解时,可以使用@Validated
来声明一个校验组,这样可以只在某个特定组中执行校验规则。例如:
@Validated
@RestController
public class UserController {
@RequestMapping("/users")
public List<UserDTO> getUsers(@RequestParam @Size(min = 1, max = 10, message = "用户名长度必须在1~10字符之间!") String name) {
// do something
}
}
在上述示例中,使用了@Validated
注解来声明校验规则组,同时在@RequestParam注解中使用了@Size注解来指定name参数的校验规则,并在注解中指明了校验组。
Valid和Validated的区别
@Valid
和@Validated
的区别主要有两点:
-
Supported locations:
@Valid
注解只支持标注在Field、Getter、Setter、Constructor和Method参数上,而@Validated
注解只能用来标记方法和类。 -
Group support:
@Valid
注解只能进行默认或默认分组的校验,而@Validated
注解除了支持分组的校验外,还可以指定多个验证组。
综上所述,可以看出二者之间并没有直接的比较,而使用场景也不太相同。
示例代码
下面是一个例子,其中展示了如何在Java Bean中应用@Valid
和@Validated
注解,具体代码如下。
public class UserDTO {
@NotNull(message = "用户名不能为空!")
private String name;
@Length(min = 8, max = 32, message = "密码长度必须在8~32字符之间!")
private String password;
@Valid
private AddressDTO address;
@Min(value = 18, message = "年龄必须大于等于18岁!")
private int age;
// 省略getter和setter方法
}
public class AddressDTO {
@NotNull(message = "省份不能为空!")
private String province;
@NotNull(message = "城市不能为空!")
private String city;
@NotNull(message = "区县不能为空!")
private String district;
// 省略getter和setter方法
}
@RestController
@Validated
public class UserController {
@RequestMapping("/user")
public UserDTO addUser(@RequestBody @Valid UserDTO userDTO) {
// do something
}
@GetMapping("/user/{id}")
public UserDTO getUserById(@PathVariable @Min(value = 1, message = "用户ID必须大于等于1!") Long id) {
// do something
}
}
在上述代码中,UserDTO和AddressDTO是Java Bean,用于承载用户信息和地址信息。其中,在UserDTO中使用了@Valid
注解对AddressDTO进行递归校验,在UserController中使用了@Validated
注解并在方法上使用了@RequestBody
注解和@PathVariable
注解来指定参数的校验规则。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的Valid和Validated的比较内容 - Python技术站