java对get参数校验失败_Spring参数校验的异常处理
对于不同的参数解析⽅式,Spring 抛出的异常也不同,⽽且这些异常没有继承关系,异常的内部也各不相同,只能对每种异常单独处理。感觉这块地⽅ spring 没有设计好,处理起来⽐较⿇烦。
跟参数相关的异常主要有三个需要⼿动处理。
org.springframework.validation.BindException
org.springframework.web.bind.MethodArgumentNotValidException
javax.validation.ConstraintViolationException
⼀个⼀个说
BindException
抛出异常的场景
请求参数绑定到java bean上失败时抛出
关键词 : @Valid 、 Java bean 、表单(Content-Type: multipart/form-data)
实例
通过 post 提交表单的⽅式访问 /register 接⼝,如果参数校验不通过会抛出 BindException 异常
异常的默认处理⽅式
org.springframework.validation.BindException 异常由
org.springframework.web.hod.annotation.handleBindException() ⽅法处理,如下
异常的默认处理结果
例⼦如下,密码要求8到16位,我只填了4位时
完整返回值如下
可以看到,返回的结果过于详细,把类的内部结构都暴露了,这样肯定是不⾏的,我们需要对其进⾏⾃定义处理。
⾃定义异常的处理
spring ⽀持统⼀异常处理,我们可以在⾃定义的统⼀异常处理类中处理 BindException 异常
关于 spring 统⼀异常处理,请参考 基于spring 的统⼀异常处理
⽅式1
继承 org.springframework.web.hod.annotation.ResponseEntityExceptionHandler 类,重写handleBindException() ⽅法
注意,类上需要打 @ControllerAdvice 注解
@ControllerAdvice
public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler {
private static final Logger logger = Logger(ApplicationExceptionHandler.class);
/**
* 表单绑定到 java bean 出错时抛出 BindException 异常
*
* @param ex
* @param headers
* @param status
* @param request
* @return
*/
@Override
protected ResponseEntity handleBindException(BindException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
<("参数绑定失败", ex);
if (ex.hasErrors()) {
List> list = new ArrayList<>();
for (ObjectError objectError : ex.getAllErrors()) {
Map map = new HashMap<>();
if (objectError instanceof FieldError) {
FieldError fieldError = (FieldError) objectError;
map.put("field", Field());
map.put("message", DefaultMessage());
} else {
map.put("field", ObjectName());
map.put("message", DefaultMessage());validation框架
}
list.add(map);
}
return new ResponseEntity<>(new FailResult<>(ApplicationEnum.PARAMETER_BIND_FAIL, list), HttpStatus.OK); }
return super.handleBindException(ex, headers, status, request);
}
}
复制代码
⽅式2
通过 @ExceptionHandler 注解指定要处理的异常,并在处理⽅法中处理。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论