@Validated的简单使用

DBC 1.4K 0

一、添加依赖

温馨提示

springboot项目,可以不用引入了,已经引入了,他就存在于最核心的 web 开发包里面。

为了避免不必要的错误,可以直接添加如下依赖

		<!--  begin -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>6.1.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish</groupId>
			<artifactId>javax.el</artifactId>
			<version>3.0.1-b11</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator-cdi</artifactId>
			<version>6.1.0.Final</version>
		</dependency>
		<!--  end -->

搞一个异常捕捉类,一个接口响应类

ValidatedExceptionHandler

package com.example.test05.demo.handler;

import com.example.test05.demo.tool.JsonData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
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 org.springframework.web.bind.annotation.ResponseStatus;
import java.util.List;

/**
 * @author DBC
 */
@Slf4j
@ControllerAdvice
public class ValidatedExceptionHandler {

    /**
     * 处理@Validated参数校验失败异常
     * @param exception 异常类
     * @return 响应
     */
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public JsonData exceptionHandler(MethodArgumentNotValidException exception){
        BindingResult result = exception.getBindingResult();
        StringBuilder stringBuilder = new StringBuilder();
        if (result.hasErrors()) {
            List<ObjectError> errors = result.getAllErrors();
            if (errors != null) {
                errors.forEach(p -> {
                    FieldError fieldError = (FieldError) p;
                    log.warn("Bad Request Parameters: dto entity [{}],field [{}],message [{}]",fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage());
                    stringBuilder.append(fieldError.getDefaultMessage());
                });
            }
        }
        return JsonData.buildError(stringBuilder.toString());
    }
}

JsonData

package com.example.test05.demo.tool;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JsonData implements Serializable {

    /**
     * 状态码 0 表示成功
     */

    private Integer code;
    /**
     * 数据
     */
    private Object data;
    /**
     * 描述
     */
    private String msg;


    /**
     * 成功,不传入数据
     * @return
     */
    public static JsonData buildSuccess() {
        Date day=new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return new JsonData(0, df.format(day), "成功");
    }

    /**
     *  成功,传入数据
     * @param data
     * @return
     */
    public static JsonData buildSuccess(Object data) {
        return new JsonData(0, data, "成功");
    }

    /**
     * 失败,传入描述信息
     * @param msg
     * @return
     */
    public static JsonData buildError(String msg) {
        Date day=new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return new JsonData(-1, df.format(day), msg);
    }



    /**
     * 自定义状态码和错误信息
     * @param code
     * @param msg
     * @return
     */
    public static JsonData buildCodeAndMsg(int code, String msg) {
        Date day=new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return new JsonData(code, df.format(day), msg);
    }





}

大功告成,可以开始测试了!

一、测试姓名不能为空

    @NotBlank(message = "姓名不能为空!")
    private String name;
    /**
     * 姓名不能为空
     * @param userDO
     * @return
     */
        @PostMapping("testNameValidated")
    public JsonData testNameValidated(@Validated @RequestBody TbUserDO userDO) {

        return JsonData.buildSuccess(userDO);
    }

效果如下

@Validated的简单使用插图
@Validated的简单使用插图2

二、测试年龄的校验

    @Min(value = 1, message = "年龄不能小于1!")
    @Max(value = 120, message = "年龄不能大于120!")
    private String age;
    /**
     * 年龄的控制
     * @param userDO
     * @return
     */
    @PostMapping("testAgeValidated")
    public JsonData testAgeValidated(@Validated @RequestBody TbUserDO userDO) {

        return JsonData.buildSuccess(userDO);
    }

效果如下

@Validated的简单使用插图4
@Validated的简单使用插图6

三、嵌套测试

    @NotBlank(message = "姓名不能为空!")
    @Valid
    private String name;


    @Min(value = 1, message = "年龄不能小于1!")
    @Max(value = 120, message = "年龄不能大于120!")
    @Valid
    private String age;
温馨提示

@Valid,不加也可以,博主测试的时候忘记删了而已[aru_2]

    /**
     * 综合测试
     * @param userDO
     * @return
     */
    @PostMapping("testValidated")
    public JsonData testValidated(@Validated @RequestBody TbUserDO userDO) {

        return JsonData.buildSuccess(userDO);
    }

效果如下

@Validated的简单使用插图8

最后总结

好了,@Validated的简单是用到这里就结束了,后面如果遇到有意思的,也会在校验这个专栏建新文章![aru_8]

附加内容

以下图片源自https://blog.csdn.net/sunnyzyq/article/details/103527380

@Validated的简单使用插图10

温馨提示

这些注解应该足够基本使用了,如果还有别的需要看下面的这张图@Validated的简单使用插图12(图片源自:https://blog.csdn.net/qq_32352777/article/details/108424932)

重点,额外知识

我们如果在Controller层就想直接校验,那么在使用如下的方法即可

顶部直接加入

@Validated

@Validated的简单使用插图14
@Validated的简单使用插图16

@RequestParam() @NotNull(message = "ID不可以为空")
温馨提示

这里需要注意的是,@RequestParam()这个不可以缺少,要不然会无效,切记[aru_22]!

发表评论 取消回复
表情 图片 链接 代码

分享