如何优雅地进行参数/实体字段验证???

 

你是否还在像下面那样进行判断参数是否合法

        //判断投诉内容是否为空
        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);
    }



}

再测试一下

测试成功!

使用这种方式进行参数校验的步骤相对简单,只需要在方法参数上添加相应的注解,然后在方法内部调用校验方法即可。在实际开发中,我们可以根据需要选择合适的注解进行参数校验,以提高代码的健壮性和可靠性。

感谢大家的阅读 希望对您有帮助!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值