java如何优雅的实现参数非空校验,快速实现参数非空校验,使用@valid实现参数非空校验

这篇具有很好参考价值的文章主要介绍了java如何优雅的实现参数非空校验,快速实现参数非空校验,使用@valid实现参数非空校验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在java项目接口中,有些必传参数需要进行非空校验,如果参数过多,代码会繁杂且冗余,如何优雅的对参数进行非空校验,下面是实现流程

一、整体思路

用实体类接收参数,使用非空注解编辑参数内容
使用 @Valid 注解对参数进行拦截,整体进行非空校验

二、引入依赖

1、SpringBoot项目

如果是SpringBoot项目,引入web开发包,就不需要再单独引入@valid依赖了、因为他存在于Web开发包中的最核心之中

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.0.5.RELEASE</version>
</dependency>

2、其他框架项目

如果不是SpringBoot项目,要在Maven的Pom中显式引入@valid依赖

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
 
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
</dependency>

三、编辑入参实体类

将接口入参使用实体类接收,在实体类中定义参数字段,并使用对应的注解进行注释

  • String类型使用@NotBlank
  • List类型使用@NotEmpty
  • 其他类型使用@NotNull
  • message中是如果字段为空返回的提示内容
@Data
public class aaa {
    @NotBlank(message = "testStr不能为空")
    private String testStr;
    
    @NotNull(message = "testInt不能为空")
    private Integer testInt;
    
    @NotEmpty(message = "testList不能为空")
    private List<Long> testList;
}

四、定义返回的实体类

package com.test;

import lombok.Data;

/**
 * @author
 * @title 响应实体类
 * @param <T>
 */
@Data
public class Result<T> {
    private String code;//返回码
    private String msg;//消息
    private T data;//返回数据


    /**
     * @title 成功消息
     * @param
     * @return
     */
    public static <T> Result<T> OK() {
        return rspMsg(ResponseEnum.SUCCESS);
    }


    /**
     * @title 失败消息
     * @param
     * @return
     */
    public static <T> Result<T> error() {
        return rspMsg(ResponseEnum.SERVER_INNER_ERR);
    }

    /**
     * @title 失败消息
     * @param
     * @return
     */
    public static <T> Result<T> error(String msg) {
        Result<T> message = new Result<T>();
        message.setCode(ResponseEnum.FAIL.code);
        message.setMsg(msg);
        return  message;
    }


    public static <T> Result<T> waring(String msg) {
        Result<T> message = new Result<T>();
        message.setCode("2");
        message.setMsg(msg);
        return  message;
    }

    /**
     * @title 自定义消息
     * @param
     * @return
     */
    public static <T> Result<T> rspMsg(ResponseEnum responseEnum) {
        Result<T> message = new Result<T>();
        message.setCode(responseEnum.getCode());
        message.setMsg(responseEnum.getMsg());
        return message;
    }


    /**
     * @title 返回数据
     * @param data
     * @return
     */
    public static <T> Result<T> OK(T data) {
        Result<T> responseData = new Result<T>();
        responseData.setCode(ResponseEnum.SUCCESS.getCode());
        responseData.setData(data);
        responseData.setMsg(ResponseEnum.SUCCESS.getMsg());
        return responseData;
    }

    /**
     * @title 返回数据
     * @param data
     * @return
     */
    public static <T> Result<T> ok(T data) {
        Result<T> responseData = new Result<T>();
        responseData.setCode(ResponseEnum.SUCCESS.getCode());
        responseData.setData(data);
        responseData.setMsg(ResponseEnum.SUCCESS.getMsg());
        return responseData;
    }

    /**
     * @title 返回数据-自定义code
     * @param data
     * @return
     */
    public static <T> Result<T> OK(String code , T data) {
        Result<T> responseData = new Result<T>();
        responseData.setCode(code);
        responseData.setData(data);
        return responseData;
    }



    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }



    /**
     * @author
     * @title 响应消息枚举
     */
    public enum ResponseEnum {
        // 可以根据自己的实际需要增加状态码
        SUCCESS("0", "操作成功"),
        FAIL("1", "操作失败"),
        SERVER_INNER_ERR("500","未知异常,请联系管理管"),
        PARAM_LACK("100" , "非法参数"),
        ;

        private String code;
        private String msg;

        ResponseEnum(String code, String msg) {
            this.code = code;
            this.msg = msg;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }
    }

}

五、Controller层参数校验

在Controller层加上 @RequestBody 和 @Valid 注解,并且加上 BindingResult res 对参数进行捕获

@PostMapping("/test")
public Result test(@RequestBody @Valid aaa dto, BindingResult res) {
   if (res != null) {
   		//获取校验内容是否为空
        if (res.hasErrors()) {
            List<ObjectError> errorList = res.getAllErrors();
            List<String> resultList = new ArrayList<>();
            for (ObjectError error : errorList) {
            	//获取所有校验错误信息
                resultList.add(error.getDefaultMessage());
            }
            //将错误信息返回
            return Result.error(String.join(",", resultList));
        }
    }
    
    //接口其他逻辑操作
    return Result.ok("非空参数都有值");
}

六,测验结果

如果调用此接口,全部参数都为空,则会返回下面内容

{
    "msg": "testStr不能为空,testInt不能为空,testList不能为空",
    "code": 1
}

七、拦截器补充

其实到上面第六步就已经完成了,但是如果接口过多,每个接口里面都要写这一长串拦截的内容,代码过于冗余,于是加上了一个拦截器

1、加拦截器内容

整个项目加上一个拦截器,拦截器内容如下

package com.test.interceptor;

import com.test.common.Result;
import org.springframework.validation.BindingResult;
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 java.util.ArrayList;
import java.util.List;

@ControllerAdvice
public class ControllerExceptInterceptor {

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleValidException(MethodArgumentNotValidException e) {
        //日志记录错误信息
       // log.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
        BindingResult bindingResult= e.getBindingResult();
        if (bindingResult != null) {
            if (bindingResult.hasErrors()) {
                List<ObjectError> errorList = bindingResult.getAllErrors();
                List<String> resultList = new ArrayList<>();
                for (ObjectError error : errorList) {
                    resultList.add(error.getDefaultMessage());
                }
                return Result.error(String.join(",", resultList));
            }
        }

        return Result.error();
    }
}

2、修改Controller层内容

去掉controller层中的 BindingResult res 内容,去掉参数非空校验代码,但是必须要加 @RequestBody @Valid 才有效,如下

@PostMapping("/test")
public Result test(@RequestBody @Valid aaa dto) {
    //接口其他逻辑操作
    return Result.ok("非空参数都有值");
}

结束:上面是文章全部内容,如果接口数量少,直接前六步就行,接口过多,可以使用拦截器,如有问题和建议欢迎留言评论。文章来源地址https://www.toymoban.com/news/detail-719838.html

到了这里,关于java如何优雅的实现参数非空校验,快速实现参数非空校验,使用@valid实现参数非空校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot】SpringBoot 优雅地校验参数

    1、为什么要校验参数? 在日常的开发中,为了防止非法参数对业务造成影响,需要对接口的参数进行校验,以便正确性地入库。 例如:登录时,就需要判断用户名、密码等信息是否为空。虽然前端也有校验,但为了接口的安全性,后端接口还是有必要进行参数校验的。 同时

    2024年02月05日
    浏览(35)
  • 基于java实现责任链进行参数校验

    在Java中,责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许对象以链式的方式组织起来,以便请求可以在链中传递,直到被某个对象处理为止。这种模式为多个对象处理同一请求提供了灵活的机制,并且可以将请求的处理者与请求的发送者解耦。 降低耦合

    2024年04月26日
    浏览(27)
  • Java代码瘦身,巧用 @Valid,@Validated 的分组校验和嵌套检验,实现高阶参数校验操作

            在 JavaEE 项目中, RestFull 层接收参数首先要对一些字段的格式进行校验,以防止所有查询都落到数据库,这也是一种合理的限流手段。以前基本上都是用 if...else...,这样的代码太啰嗦,除了使用策略模式进行优化,今天介绍一下校验注解@Valid,@Validated和@PathVariable,

    2024年02月04日
    浏览(47)
  • 化繁为简,使用Hibernate Validator实现参数校验

    目录 前言 环境配置 导入依赖 基础校验 校验注解 参数绑定 @PathVariable @RequestParam @RequestBody @Validated @Valid 单参校验 对象校验 分组校验 顺序校验         在之前的悦享校园的开发中使用了SSM框架,由于当时并没有使用参数参数校验工具,方法的入参判断使用了大量的if else语

    2024年02月12日
    浏览(42)
  • Spring Boot中使用JSR-303实现请求参数校验

    JSR-303是Java中的一个规范,用于实现请求参数校验。它定义了一组注解,可以应用于JavaBean的字段上,用于验证输入参数的合法性。下面是一些常用的JSR-303注解及其介绍: @NotNull :用于验证字段值不能为null。 @NotEmpty :用于验证字符串字段不能为空。 @NotBlank :用于验证字符

    2024年02月08日
    浏览(39)
  • 7.1「实战」图书录入和修改API --如何优雅处理校验逻辑?

    在做了这么多架构铺垫之后,一位订阅同学非常期待我能更新主线API,我觉得他的想法非常合理,所以今天就来安排~~~ 我主要考虑的是: 首先输出主线API,是能让你先鸟瞰全貌,更容易发现设计上存在的问题,然后我再从架构设计上解决这些问题,那么你就能更清楚架构上

    2024年02月08日
    浏览(35)
  • 技术扫盲:如何优雅的使用 java -jar

    java -jar xxx.jar java -jar 是一个用于在命令行界面中执行 Java 可执行 JAR 文件的命令。它的语法如下: 其中: java 是 Java 运行时环境的可执行文件。 -jar 是一个选项,表示要执行的文件是一个 JAR 文件。 JAR 文件路径 是要执行的 JAR 文件的路径。 [参数] 是可选的命令行参数,用于

    2024年02月03日
    浏览(36)
  • springboot如何优雅的获取前端参数

    对于初学者来说,困难的不是理论知识,而是如何在程序中具体实现。 现在的项目基本上都是前后端分离的项目,如何打通前后端,接收前端传过来的参数呢? 废话不多说,这篇文章就来说一说接收前端参数的具体操作 1.1 核心代码 1.2 测试结果 在访问“http://localhost:8080/a

    2024年03月17日
    浏览(35)
  • SpringBoot如何优雅接收前端请求参数

    @RequestParm 我们可以通过 @RequestParm 注解去绑定请求中的参数,将(查询参数或者form表单数据)绑定到controller的方法参数中,通俗点说就是,我们可以在get请求和post请求中使用改注解,get请求中会从查询参数中获取参数,post请求会从form表单或者查询参数中获取参数 默认情况

    2024年02月11日
    浏览(34)
  • java的validation框架(参数校验)

    空值校验类:@Null,@NotNull,@NotEmpty,@NotBlank等 范围校验类:@Min,@Size,@Digits,@Future,@Negative等 其它校验类:@Email,@URL,@AssertTrue,@Pattern等 1. @NotNull(message = “用户id不能为空”) 没有设置值时会返回 设置为userInfo.setUserId(\\\"\\\");时不会返回 userInfo.setUserId(\\\" \\\");时不会返回 2.@Not

    2024年01月22日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包