@ControllerAdvice @valid实现拦截错误信息响应json给前端 参数效验

@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**

区别

  1. @Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制

  2. 使用范围

@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             /* 包声明  */
}      
  1. @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;
    }
}

在这里插入图片描述
whai的个人博客 whai.space 欢迎留言!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值