Java Spring项目通过注解方式对参数值进行合理性校验

原创 fengGo     发表于  2020-12-01 15:41       402

当下时代,简约、快捷是王道!如果一个开发框架不支持注解式编程,都会被吐槽,被贴上 Low 的标签。记得当初刚入行搞 Java 的时候,那时候 Hibernate 持久层框架大行其道,注解式编程开发起来确实比较舒服。

不过当时写代码时,比较实诚,业务代码一行接着一行,比如对前端请求的参数合理性校验都会在业务代码中进行。时间越久越是变懒了,现在总是想着法的怎么减少代码编写量。就拿参数校验来说,前端请求过来的参数合理性判断,好的办法就是定义一个实体类来封装请求参数,使用 @Valid 注解结合java validation、hibernate validation注解进行校验。

参数封装实体类代码参考:

@Data
public class PlaceUseRuleAddParam implements Serializable {

    private static final long serialVersionUID = 6111867217751775796L;

    @NotNull(message = "车位ID不能为空")
    private BigInteger placeId;
    @Min(value = 1, message = "开始区间必须大于0")
    private int startInterval;
    @Min(value = 1, message = "结束区间必须大于0")
    private int endInterval;
    /**
     * 开始时间
     */
    private float startTime;
    /**
     * 结束时间
     */
    private float endTime;
}

Controller方法参考:

@PostMapping("add")
@ApiOperation(value = "添加", produces = "application/json")
public void addUseRule(@RequestBody @Valid PlaceUseRuleAddParam param) {        //获取登录用户信息
     SysUserDto userInfo = tokenUtil.getUserInfoByToken();
     this.parkingPlaceUseRuleService.add(param, userInfo.getId());}

以上代码,我们无需再业务代码中进行合理性判断,使用注解的方式,根据规则输出 message 提示信息即可。

注意:如果是实体类中还包含实体类,内部的实体类得加上 @Valid 注解标签,否则内部封装类得合理性参数校验注解无效!例如:

@NotNull(message = "预定规则列表不能为空")
@Valid
private List<StopRuleTimeInfoParam> reserveArray;

更多 java validation 校验注解参考:

@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(regex=,flag=)  被注释的元素必须符合指定的正则表达式

更多 hibernate validation 校验注解参考:

@Email  被注释的元素必须是电子邮箱地址    
@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内    
@NotEmpty   被注释的字符串的必须非空    
@Range(min=,max=,message=)  被注释的元素必须在合适的范围内
@URL(protocol=,host=,    port=, regexp=, flags=)  合法的url

注意:@NotBlank 校验注解只能用于字符串不为null,并且字符串trim()以后length要大于0,如果用于其他封装类,会报错哦!

参考文章:

Java项目接口通过注解类IsRange、IsRangeValidator对参数进行范围限制

更多注解,可参考Obatis开源项目obatis-web中的注解校验包:https://github.com/obatis/obatis-web/tree/master/src/main/java/com/obatis/core/annotation/validator,欢迎您提出宝贵的意见,为Obatis开源项目舔砖加瓦!