携手创作,共同成长!这是我参与「掘金日新计划 · 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=) 被注释的元素必须在合适的范围内
使用示例,如下图所示:
图中我们可以看到使用了@Validated注解来实现对请求提的校验,请求体重添加具体的校验规则,如下图
喜欢,请关注公众号《coder练习生》