@ControllerAdvice实现拦截错误信息响应json给前端 参数效验
使用的jar
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.1.4.GA</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- SpringMVC校验 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.1.Final</version>
</dependency>
务必导入jboss-logging
不导入报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger
controller
@Controller
public class BasicController {
@RequestMapping("/text")
@ResponseBody
public JsonResponse text(@Validated @RequestBody User user) throws Exception {
JsonResponse jsonResponse=new JsonResponse();
// jsonResponse.setData(map);
return jsonResponse;
}
}
将org.springframework.validation.annotation.Validated;
更换为
javax.validation.Valid;
依然能够正常使用
*@valid和@validated
Spring Validation 提供了**@Validated**
javax提供了**@Valid**
区别
-
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制
-
使用范围
@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
//方法 字段 构造方法 类型
@Retention(RUNTIME)
@Documented
public @interface Valid {
}
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
//类型、方法和方法参数,成员属性不能使用
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
public enum ElementType {
TYPE, /* 类、接口(包括注释类型)或枚举声明 */
FIELD, /* 字段声明(包括枚举常量) */
METHOD, /* 方法声明 */
PARAMETER, /* 参数声明 */
CONSTRUCTOR, /* 构造方法声明 */
LOCAL_VARIABLE, /* 局部变量声明 */
ANNOTATION_TYPE, /* 注释类型声明 */
PACKAGE /* 包声明 */
}
- @Validated 和 @Valid 都无法单独嵌套验证,利用@Valid可以用于成员属性的特性
public class User{
@min(value=1)
private long id;
@Valid//嵌套验证使用
@NotNull
private List(comment) comment
}
使用建议: 方法上使用@Validated,属性上用@Valid
model
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User implements Serializable {
@Max(10)
@Min(2)
private int userId;
private String userUid;
private String username;
private String password;
private int userAge;
private Date userBirthday;
private String userEmail;
private String userMobile;
}
@ControllerAdvice @ExceptionHandler 拦截
package com.zust.controller;
import com.zust.util.JsonResponse;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* spring统一异常处理
* 将异常信息封装成JSON返回给前端
* @author whai
* @Date: 2020/4/6 14:48
*/
@Controller
@ControllerAdvice
public class ValidParamExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public JsonResponse handleMethodArgumentNotValidException(
MethodArgumentNotValidException ex){
BindingResult bindingResult = ex.getBindingResult();
List<FieldError> errors = bindingResult.getFieldErrors();
//初始化错误信息大小
Map<String,String> errorMessage = new HashMap<>(errors.size());
for (FieldError error: errors
) {
errorMessage.put(error.getField(), error.getDefaultMessage());
}
JsonResponse jsonResponse = new JsonResponse();
jsonResponse.setErrMsg(errorMessage.toString());
return jsonResponse;
}
}