字段校验的注解
在Java中,有多种方式可以进行字段校验的注解。以下是一般常用的几种方式:
- 使用javax.validation注解:
○ Java Bean Validation(JSR 380)是JavaEE的标准规范,提供了一系列的注解来进行字段校验,如@NotNull、@NotEmpty、@Min、@Max等。
○ 可以在字段上直接添加相应的注解,通过使用校验器(Validator)对目标对象进行校验。 - 使用Hibernate Validator注解:
○ Hibernate Validator 是基于Java Bean Validation的一个实现,提供了额外的校验注解,如@Email、@Pattern、@Length等。
○ 与Java Bean Validation类似,可以在字段上添加相应的注解,并使用校验器对目标对象进行校验。 - 自定义注解:
○ 可以使用Java提供的元注解(如@Target、@Retention)自定义字段校验注解。
○ 在自定义注解中编写校验逻辑,可以使用反射或其他方式对目标对象进行校验。 - 使用第三方库:
○ 除了上述的Java标准和第三方库外,还可以使用一些开源的字段校验库,如Apache Commons Validator、Guava Preconditions等。
○ 这些库提供了丰富的字段校验功能和注解,可以根据具体需求选择合适的库进行使用。
以上是一般常用的几种方式来进行字段校验的注解。具体选择哪种方式取决于项目需求和个人偏好。无论选择哪种方式,字段校验注解都可以在Java开发中起到简化代码、提高开发效率和保证数据准确性的作用。
实现
在Java中,可以使用各种框架和库来进行字段校验,并使用相应的注解来定义校验规则。以下是两个常用的字段校验框架和相应的Maven依赖(pom包):
- Hibernate Validator:
○ Maven依赖:
○ 示例注解:javax.validation.constraints包下提供了一些常见的校验注解,例如:
■ @NotNull:检查字段不能为null。
■ @NotEmpty:检查字段不能为空。
■ @Size(min, max):检查字段长度在指定范围内。
■ @Email:检查字段是否符合Email地址的格式。
■ @Pattern(regex):检查字段是否匹配指定的正则表达式等。
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
- Spring Validation:
○ Maven依赖:
○ 示例注解:org.springframework.validation.annotation包下提供了一些常见的校验注解,例如:
■ @NotNull:检查字段不能为null。
■ @NotEmpty:检查字段不能为空。
■ @Size(min, max):检查字段长度在指定范围内。
■ @Email:检查字段是否符合Email地址的格式。
■ @Pattern(regex):检查字段是否匹配指定的正则表达式等。
springboot 项目,那么可以不用引入了,已经引入了,他就存在于最核心的 web 开发包里面
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
如果你不是 springboot 项目,那么引入下面依赖即可:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
这些注解可以与Java Bean Validation(JSR 380)规范一起使用,可用于对实体类中的字段进行校验。只需在需要校验的字段上添加相应的注解,然后在验证过程中触发校验即可。
注意:具体使用哪个校验框架以及使用哪些注解取决于项目需求和技术栈的选择。以上提供的示例是最常见和广泛
应用的校验框架和注解之一。
Hibernate Validator提供的校验注解:
@NotBlank(message =) 只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空,不能为 null、“”,可以为 " "
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
接口参数校验样例
@NotNull,@NotBlank,@Valid自动判定空值
搭建springboot项目,我们都是采用的Restful接口,那么问题来了,当前端调用接口或者是其他项目调用时,我们不能单一靠调用方来控制参数的准确性,自己也要对一些非空的值进行判定。
按照我们以往的做法,都是对request中的参数一个一个进行非空判定。
model
public class Order {
private Long userID;
private Long addressID;
private String comment;
}
Controller:
@PostMapping("/createOrders")
public String createOrders(@RequestBody Order dto) {
if(dto.getUserID==null)return "userID不能为空";
if(dto.getAddressID==null)
return "addressID不能为空";
if(dto.getComment==null)
return "comment不能为空";
return "sucess";
}
这种做法首先是可取的,能达到我们的要求,但是这样如果model字段过多,判定的就很多,相对维护起来就不是那么方便,其次增加controller层的负担,既然我们来到spring4的时代,就应该适应使用注解的趋势,下面是使用注解后的比变化。
Model:
public class Order {
@NotNull(message = "用户ID不能为空")
private Long userID;
@NotNull(message = "收货人地址id不能为空")
private Long addressID;
@NotBlank(message = "备注不为空")
private String comment;
}
Controller
@PostMapping("/createOrders")
public String createOrders(@RequestBody @Valid Order dto, BindingResult results) {
if (results.hasErrors())
return results.getFieldError().getDefaultMessage();
return "success";
}
这样我们就只需要在model字段上加上非空验证和相应提示语就好了。
三、常用的校验注解
- javax.validation.constraints.NotNull
- @Null 被注释的元素必须为null
- @NotNull 被注释的元素不能为null
- @AssertTrue 被注释的元素必须为true
- @AssertFalse 被注释的元素必须为false
- @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max,min) 被注释的元素的大小必须在指定的范围内。
- @Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past 被注释的元素必须是一个过去的日期
- @Future 被注释的元素必须是一个将来的日期
- @Pattern(value) 被注释的元素必须符合指定的正则表达式。
- @Email 被注释的元素必须是电子邮件地址
- @Length 被注释的字符串的大小必须在指定的范围内
- @NotEmpty 被注释的字符串必须非空
- @Range 被注释的元素必须在合适的范围内
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
或者
<!--注解校验框架-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${validator.version}</version>
</dependency>
BindingResult
如果@Valid|Validated校验不通过,那么错误信息就会封装到BindingResult对象了,可以通过
BindingResult的相关方法获取详细的错误信息并返回给用户。 代码如下:
如果@Valid|Validated校验不通过,那么错误信息就会封装到BindingResult对象了,可以通过
BindingResult的相关方法获取详细的错误信息并返回给用户。 代码如下:
public class LoginUser {
@NotBlank(message = "手机号码不能为空")
private String phone;
@NotBlank(message = "密码不能为空")
private String passWord;
}
@RestController
@RequestMapping("/valid")
public class ValidControllerTest {
public static final Logger logger = LoggerFactory.getLogger(ValidControllerTest.class.getName());
@PostMapping("/login")
public String doLogin(@RequestBody @Validated LoginUser loginUser, BindingResult bindingResult){
if(bindingResult.hasErrors()){
List<ObjectError> allErrors = bindingResult.getAllErrors();
allErrors.forEach( v ->{
logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
});
}
return "数据校验通过";
}
}
loginUser======密码不能为空
loginUser======手机号码不能为空
@ApiOperation("任务创建")
@PostMapping(value = "/task/save")
public ResponseVO<String> add(HttpServletRequest request, @Valid @RequestBody CallLabelTaskDTO callLabelTaskDTO, BindingResult bindingResult){
if (bindingResult.hasErrors()) {
throw new AiHelperServiceException(bindingResult.getAllErrors().get(0).getDefaultMessage());
}
String token = request.getHeader(Constants.JWT_TOKEN);
return ok(callLabelService.save(token,getUserInfo(request),callLabelTaskDTO));
}