你是否还在像下面那样进行判断参数是否合法
//判断投诉内容是否为空
if(StringUtil.isEmpty(complaint.getComplaintUpDes())){
throw new BasicException(BasicErrorCode.DES_IS_NOT_EXIST.getLabel());
}
//判断楼栋单元门牌号是否为空
if(StringUtil.isEmpty(complaint.getComplaintUpHome())){
throw new BasicException(BasicErrorCode.HOME_IS_NOT_EXIST.getLabel());
}
在 Java 开发中,参数校验是一个非常重要的环节。为了避免程序出现不必要的异常和错误,我们需要对方法的参数进行校验。而在校验参数的过程中,使用注解可以帮助我们更加高效、准确地进行参数校验。
本文要介绍的方式是使用Java Bean Validation API(JSR 380):Java Bean Validation API是Java EE规范的一部分,它提供了一套注解,可以用来验证Java对象的属性值。例如,@NotNull注解可以用来验证属性值不为null,@Size注解可以用来验证字符串长度等。这种方法的优点是可以很容易地将参数验证与业务逻辑分离,并且提供了一种通用的验证方式。
首先导入依赖
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
具体使用
可将以下注解加在实体类字段上 可在方法参数前加入
这些注解各大平台 有很多大佬分享解释 我这里就不过多赘述啦
例如:
实体类字段上
/** 上报人姓名 */
@NotBlank(message = "上报人不能为空")
private String complaintUpName ;
/** 手机号 */
@NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码格式不正确")
private String complaintUpPhone ;
方法参数前
public void doSomething(@NotBlank String param) {
// 参数 param 不为空,且不只包含空格
}
public void doSomething(@NotEmpty List<String> list) {
// 参数 list 不为空
}
然后在需要验证的接口上加上@Valid注解
@PostMapping("/add")
public String add(@RequestBody@Valid Complaint complaint){
return complainService.insert(complaint);
}
ok 测试一下
这里 我们看到 检验已经生效 但是只是单纯地返回Bad Request 没有具体的信息
我们需要使用@ExceptionHandler注解来捕获这个异常,获取异常信息进行返回
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Object> handleValidationException(MethodArgumentNotValidException ex) {
Map<String, Object> body = new LinkedHashMap<>();
body.put("timestamp", new Date());
body.put("status", HttpStatus.BAD_REQUEST.value());
List<String> errors = ex.getBindingResult()
.getFieldErrors()
.stream()
.map(x -> x.getDefaultMessage())
.collect(Collectors.toList());
body.put("errors", errors);
return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
}
}
再测试一下
测试成功!
使用这种方式进行参数校验的步骤相对简单,只需要在方法参数上添加相应的注解,然后在方法内部调用校验方法即可。在实际开发中,我们可以根据需要选择合适的注解进行参数校验,以提高代码的健壮性和可靠性。
感谢大家的阅读 希望对您有帮助!