文件名称 | 版本号 | 作者 | 版本 | |
---|---|---|---|---|
spring-web加javax.validation实现统一验证处理 | v1.0.3 | 学生宫布 | 8416837 | SpringBoot 2.2.6 |
!直接看代码比较易懂
这是一个web接口,注意注解的写法
@GetMapping("/listByIds")
@Validated // import org.springframework.validation.annotation.Validated;
private ServiceR listByIds(@RequestParam @NotEmpty Long[] ids) { // import javax.validation.constraints.NotNull;
... ...
}
当参数ids
为null或无元素时,将被拒绝服务。
写一个类拦截异常
@RestControllerAdvice
public class BaseController {
@ExceptionHandler({Exception.class})
public Response handleException(Exception e) {
return Response.error(e.getMessage());
}
}
当访问异常时,将统一由此返回信息给调用方。Rest json化。如不传参调用接口时↓
↑因为ids不存在
或者抛出RuntimeException
时,会被RestControllerAdvice拦截到,从而进行一些处理。
if(参数不合法) throw new RuntimeException("参数长度不能为0!"); // 会进入RestControllerAdvice
总而言之,简化代码,使代码优雅。
处理@RequestBody Json参数
代码
Model:
【注意】类上面不要加@Validated
@NotBlank(message = "服务名称不能为空")
private String routeName;
Controller:
private R save(@RequestBody @Validated GwRouteDO entity) {
测试
- 不传或传空值(加了非空注解的参数),试试
抛出异常:
org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in private com.abc.common.utils.R com.abc.gateway.admin.provider.RouteProvider.save(com.abc.gateway.admin.entity.GwRouteDO): [Field error in object 'gwRouteDO' on field 'routeName': rejected value []; codes [NotBlank.gwRouteDO.routeName,NotBlank.routeName,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [gwRouteDO.routeName,routeName]; arguments []; default message [routeName]]; default message [服务名称不能为空]]
↑告知routeName不能为空
统一处理这种参数异常
但是上文那种提示太不友好了,因此我们需要规范化:
- 代码 节选
// 加上注解拦截异常,对应异常会进入对应代码
@RestControllerAdvice
public class BaseController {
@ExceptionHandler(MethodArgumentNotValidException.class)
public R bindException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
StringBuilder sb = new StringBuilder();
sb.append("参数校验不通过:");
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append("\n");
sb.append(fieldError.getDefaultMessage());
}
return R.error(sb.toString());
}
}
- 效果:
统一正则验证
// 在字段加正则注解,↓只对字符串相以及关类型有效
@Pattern(
regexp = "^[a-zA-Z][a-zA-Z0-9_]*$",
message = "名称不合法"
)