controller中优雅的完成参数校验

283 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

controller的主要工作有哪些呢?主要有以下几点

  • 接收接口入参
  • 调用service层完成业务处理
  • 捕获异常,做出正常响应

今天我们要聊得是我们如何对接口入参完成校验,而且是优雅的完成参数校验!

首先来看一下,我们平常参数校验的错误示例:

@RestController
@RequestMapping("transit/test/transituser")
public class TransitUserController extends BaseController{
    @Autowired
    private TransitUserService transitUserService;

    /**
     * 修改
     */
    @ApiOperation(value = "修改")
    @Transactional
    @PostMapping("/update")
    public ApiResult<Integer> updateTransit(@RequestBody TransitUserReq transitUserReq) throws BaseException{
        if(StringUtils.isEmpty(transitUserReq.getPassword())){
            throw new ParamException("密码不能为空");
        }
        if(StringUtils.isEmpty(transitUserReq.getUsername())){
            throw new ParamException("用户名不能为空");
        }
        ApiResult<Integer> apiResult = new ApiResult<>();
        int result = transitUserService.updateByPrimaryKeySelective(transitUserReq);
        logger.info("【TransitUser修改操作】修改结果:{}",result);
//        apiResult.getData().put("result",result);
        apiResult.setData(result);
        return apiResult;
    }
   } 

这里可以看到全部是用if判断来处理我们的参数校验,这里只有两个校验参数,勉强还是可以看看,但是参数一多,我们该如何处理呢?如何还是这种if else 来判断的话,整个controller会奇丑无比!那么我们有没有好的解决方案呢?答案是肯定的

JAVA API 的规范JSR303定义了校验的标准validation-api,我们比较常见的就是 hibernate vaildation。

常用的注解有如下:

  • @NotBlank 验证字符串非null,且长度必须大于0
  • @Email 被注释的元素必须是电子邮箱地址
  • @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
  • @NotEmpty 被注释的字符串的必须非空
  • @Range(min=,max=,message=) 被注释的元素必须在合适的范围内

使用示例,如下图所示:

image.png

图中我们可以看到使用了@Validated注解来实现对请求提的校验,请求体重添加具体的校验规则,如下图

image.png

喜欢,请关注公众号《coder练习生》