当前位置:网站首页>【项目实训】校验注解

【项目实训】校验注解

2022-06-12 01:13:00 par_ser

在web项目中常常要做参数校验,如果把参数校验都和业务代码混杂在一起,会使代码显得臃肿,降低代码的可读性。

参数校验是一个这么普遍的需求,于是JCP组织定义了一个标准(JSR303)来规范化这个任务操作,那就是Java Validation API。但没有提供实现,而hibernate validation是对这个规范的实现,并增加了校验注解如@Email@Length等。Spring Validation是对hibernate validation的二次封装,用于支持spring mvc参数自动校验。

JSR303支持的校验注解如下:

hibernate validation 提供的扩展注解如下:

 

引入依赖

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

上述两种皆可 

代码

RequestBody参数校验

通常POSTPUT请求会使用requestBody传递参数,在controller层我们用对象接收参数。那么只要该对象实现了getter/setter方法,springmvc会为我们自动绑定对象。只要在对象加上@Validated或者@Valid注解就能实现自动参数校验。校验失败时会抛出MethodArgumentNotValidException异常,Spring默认会将其转为http 400(Bad Request)响应。

    @ApiOperation(value="职能科室暂存事件处理表项",notes = "职能科室暂存事件处理表项")
    @PostMapping("/temporarySave")
    @LogAnnotation(operation = "职能科室暂存事件处理表项")
    public ResponseResult temporarySave(HttpServletRequest request, @RequestBody @Validated({TemporarilySave.class}) FunctionalDepartmentChartDTO functionalDepartmentChartDTO){
        adverseEventReportFunctionalDepartmentRelationService.temporarySave(request,functionalDepartmentChartDTO);
        return ResponseResult.okResult();
    }

RequestParam/PathVariable参数校验

GET请求一般会使用requestParam/PathVariable传参。在这种情况下,必须在Controller类上标注@Validated注解,并在入参上声明约束注解(如@Min等)。如果校验失败,会抛出ConstraintViolationException异常。

@RestController
@RequestMapping("/patientInfo")
@Validated
public class PatientInfoController {
    @Autowired
    private IPatientInfoService patientInfoService;

    @ApiOperation(value = "根据住院号,门诊号或就诊卡号来查询病人信息",notes = "method:0是住院,1是门诊,2是就诊卡")
    @GetMapping("/{key}/{method}")
    @LogAnnotation(operation = "根据住院号,门诊号或就诊卡号来查询病人信息")
    public ResponseResult get(@PathVariable("key")  String key , @PathVariable("method")  @Range(min = 0,max = 2,message = "method需要在0和2之间") Integer method){
        return ResponseResult.okResult(patientInfoService.get(key,method));
    }
}

PS:针对上述所说的MethodArgumentNotValidException和ConstraintViolationException,我们可按照之前所讲的“统一异常处理”,也做异常拦截,进行统一的处理。

分组校验

同个类的对象,可能作为不同接口的参数,在校验时遵循不同的规则,于是我们需要分组校验来加以区分。具体地,类似下方代码,在校验注解中注明其适用的组别,在@Valided注解处注明要使用的组别(如@Validated({Persist.class})

    /**
     * 产品名称
     */
    @NotBlank(message = "产品名称不能为空", groups = {Persist.class})
    private String productName;

    /**
     * 注册证号
     */
    @NotBlank(message = "注册证号不能为空", groups = {Persist.class})
    private String registrationNum;

原网站

版权声明
本文为[par_ser]所创,转载请带上原文链接,感谢
https://blog.csdn.net/par_ser/article/details/125127876

随机推荐