5.1.2 启动验证调用新增方法,通过新增方法调用validateParams方法
报错日志如下
java.lang.RuntimeException: 手机号不合法:对象:SysUser,字段:phone,值:1359995.2 非spring环境验证5.2.1 定义验证方法直接获取默认的工厂类,然后获取验证对象进行验证
public static void main(String[] args) {ValidatorFactory vf = Validation.buildDefaultValidatorFactory();Validator validator = vf.getValidator();SysUser user = new SysUser();user.setId(1L);user.setUsername("zhangsan");user.setPhone("1356666");user.setEmail("example@qq.com");validator.validate(user, ValidationInterface.add.class).stream().findFirst().ifPresent(obj -> {String objName = obj.getRootBean().getClass().getSimpleName();String fieldName = obj.getPropertyPath().toString();Object val = obj.getInvalidValue();String msg = obj.getMessage();String errMsg = MessageFormat.format(msg + ":对象:{0},字段:{1},值:{2}", objName, fieldName, val);throw new RuntimeException(errMsg);});}5.2.2 启动验证报错信息如下,符合预期
Exception in thread "main" java.lang.RuntimeException: 手机号不合法:对象:SysUser,字段:phone,值:1356666 at com.ldx.valid.controller.SysUserController.lambda$main$4(SysUserController.java:215) at java.util.Optional.ifPresent(Optional.java:159) at com.ldx.valid.controller.SysUserController.main(SysUserController.java:209)6. 方法参数验证有的时候我们想在方法上直接进行参数验证,步骤如下
6.1 修改控制器直接在类上添加注解@Validated,并在方法上直接进行验证
@Slf4j@Validated@RestController@RequestMapping("sys/user")public class SysUserController {... 省略代码/*** 根据手机号和邮箱查询用户信息* @param phone 手机号* @return 用户list*/@GetMapping("selectByPhone")public CommonResult queryByPhone(@NotEmpty(message = "手机号不能为空") String phone) {List<SysUser> queryResult = USERS.stream().filter(obj -> obj.getPhone().equals(phone)).collect(Collectors.toList());return CommonResult.success(queryResult);}}6.2 启动验证不给phone字段赋值,操作结果符合预期

文章插图
错误日志:
javax.validation.ConstraintViolationException: queryByPhone.phone: 手机号不能为空7. 统一异常处理在上面的参数验证中,验证的错误信息是通过BindingResult result参数进行接收的,在每个方法中异常处理如出一辙,特别麻烦 。甚至在step 5,6都是直接将异常的堆栈信息返回给前端,这对于用来说是非常不友好的 。而且有的情况下需要我们主动抛出业务异常,比方用户不能直接删除已绑定用户的角色 。所以,开撸 。
7.1 创建业务异常类
/** * 业务异常 * @author ludangxin * @date 2021/8/5 */public class BusinessException extends RuntimeException {private static final long serialVersionUID = 1L;protected final String message;public BusinessException(String message) {this.message = message;}public BusinessException(String message, Throwable e) {super(message, e);this.message = message;}@Overridepublic String getMessage() {return message;}}7.2 创建全局异常处理器import com.ldx.valid.util.CommonResult;import lombok.extern.slf4j.Slf4j;import org.springframework.validation.BindException;import org.springframework.validation.BindingResult;import org.springframework.validation.FieldError;import org.springframework.web.HttpRequestMethodNotSupportedException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;import javax.validation.ConstraintViolation;import javax.validation.ConstraintViolationException;import javax.validation.ValidationException;import java.util.Set;/** * 全局异常处理器 * * @author ludangxin * @date 2021/8/5 */@Slf4j@RestControllerAdvicepublic class GlobalExceptionHandler {/*** 参数绑定异常类 用于表单验证时抛出的异常处理*/@ExceptionHandler(BindException.class)public CommonResult validatedBindException(BindException e){log.error(e.getMessage(), e);BindingResult bindingResult = e.getBindingResult();FieldError fieldError = e.getFieldError();String message = "[" + e.getAllErrors().get(0).getDefaultMessage() + "]";return CommonResult.error(message);}/*** 用于方法形参中参数校验时抛出的异常处理* @param e* @return*/@ExceptionHandler(ConstraintViolationException.class)public CommonResult handle(ValidationException e) {log.error(e.getMessage(), e);String errorInfo = "";if(e instanceof ConstraintViolationException){ConstraintViolationException exs = (ConstraintViolationException) e;Set<ConstraintViolation<?>> violations = exs.getConstraintViolations();for (ConstraintViolation<?> item : violations) {errorInfo = errorInfo + "[" + item.getMessage() + "]";}}return CommonResult.error(errorInfo);}/*** 请求方式不支持*/@ExceptionHandler({ HttpRequestMethodNotSupportedException.class })public CommonResult handleException(HttpRequestMethodNotSupportedException e){log.error(e.getMessage(), e);return CommonResult.error("不支持' " + e.getMethod() + "'请求");}/*** 拦截未知的运行时异常*/@ExceptionHandler(RuntimeException.class)public CommonResult notFount(RuntimeException e) {log.error("运行时异常:", e);return CommonResult.error("运行时异常:" + e.getMessage());}/*** 系统异常*/@ExceptionHandler(Exception.class)public CommonResult handleException(Exception e) {log.error(e.getMessage(), e);return CommonResult.error("服务器错误,请联系管理员");}/*** 业务异常*/@ExceptionHandler(BusinessException.class)public CommonResult businessException(HttpServletRequest request, BusinessException e) {log.error(e.getMessage());return CommonResult.error(e.getMessage());}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 解读微服务下的契约测试——看微服务如何完整应用系统验证之道
- HTML-表单标签form详细讲解学习
- python怎么验证代理IP是否有效
- 基于 el-form 封装一个依赖 json 动态渲染的表单控件
- 想验证安装的操作系统是否正版,可以这样找到Win10产品密钥
- OAuth2+JWT 实现权限验证
- 用实验来验证宇宙大爆炸理论的科学家是 大爆炸宇宙学在观测上的依据有
- CSS3伪类:valid和:invalid实现表单校验
- k8s部署高可用配置中心apollo-手动验证成功
- JS 内存管理机制及验证
