校验非空的注解@NotNull如何取得自定义的message

目录
  • 校验非空的注解@NotNull如何取得自定义的message
    • 用法:定义一个全局异常处理
  • @NotNull 等注解的简单使用
    • 2.3以前则不需要引入maven包
    • Controller层
    • 附上 部分注解

校验非空的注解@NotNull如何取得自定义的message

由于项目表单需要校验字段过多,一个一个去判空太麻烦,所以用了@NotNull注解,字段为空会抛出MethodArgumentNotValidException异常。

接下来要取得@NotNull(message=“自定义异常”)里的message内容给前端显示

直接贴上代码:

public String  getMessage(MethodArgumentNotValidException exception){
String message =  exception.getBindingResult().getFieldError().getDefaultMessage();
return message;
}

用法:定义一个全局异常处理

一旦发生该类异常,就会捕捉处理,返回给前端信息,返回类Result要根据自己项目业务需要来定义

@NotNull 等注解的简单使用

springboot 2.3.0 以后不会自动引入jar包,所以要添加以下maven

2.3以前则不需要引入maven包

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

注册一个账号, 有账号+密码

前端会做一个判空,但是后端同时也要做一个判空,防止url直接访问

这时后端的代码通常是

if(name!=null){
 return "账号不能为空,请重新输入";
}
else if(password!=null){
 return "密码不能为空,请重新输入";
}

这样就会显得特别low,而且极不美观

这时候就要用到一个注解@NotNull

简单举例说明:

@Data
public class UserInfo {
    @NotNull(message = "姓名不能为null")
    private String name;
    @Max(value = 30,message = "年龄不能超过30")
    private Integer age;
    private Integer password;
    private String sex;
}

Controller层

简单举例说明

@RestController
public class TestController {
    @RequestMapping("test1")
    public Object test1(@Valid @RequestBody UserInfo userInfo,BindingResult result){
  //判断有没有异常错误,如果有则返回默认消息
       if (result.hasErrors()){
            String defaultMessage = result.getFieldError().getDefaultMessage();
            return defaultMessage;
        }
        //打印一下数据结构
        System.out.println(userInfo);
        //如果没有错误,返回注册成功
        return "注册成功";
    }
  }

用postMan 传入json 参数,name有值,年龄超过30岁

返回我们的设定

name 为null 同理,会按顺序判断!

但是问题又来了,难道我们每个Controller层的方法里面都要写一个判断方法?

当然不,这时候就要用到全局异常类了

起一个类

@ControllerAdvice
public class ControllerException {
    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleValidException(MethodArgumentNotValidException e) {

        //将错误信息返回给前台
        return e.getBindingResult().getFieldError().getDefaultMessage();
    }
}

为了有所区分,写下另一个访问方法

 @RequestMapping("test2")
    public Object test1(@Valid @RequestBody UserInfo userInfo){

        System.out.println(userInfo);
        return "注册成功";
    }

这时候我们传入参数

到此结束,再也不用写一堆各种判空了

附上 部分注解

  • @Null 限制只能为null
  • @NotNull 限制必须不为null
  • @AssertFalse 限制必须为false
  • @AssertTrue 限制必须为true
  • @DecimalMax(value) 限制必须为一个不大于指定值的数字
  • @DecimalMin(value) 限制必须为一个不小于指定值的数字
  • @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
  • @Future 限制必须是一个将来的日期
  • @Max(value) 限制必须为一个不大于指定值的数字
  • @Min(value) 限制必须为一个不小于指定值的数字
  • @Past 限制必须是一个过去的日期
  • @Pattern(value) 限制必须符合指定的正则表达式
  • @Size(max,min) 限制字符长度必须在min到max之间
  • @Past 验证注解的元素值(日期类型)比当前时间早
  • @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
  • @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
  • @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

二次更新:所有的Controller 都写这样的代码就要封装成异常类

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;
/**
 * @author :lsy
 * @date :Created in 2020/7/23 10:13
 * @modified By:
 */
@ControllerAdvice
public class ControllerException {
    private final static String EXCEPTION_MSG_KEY = "Exception message : ";
    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleValidException(MethodArgumentNotValidException e) {
        //日志记录错误信息
       // log.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
        //将错误信息返回给前台
       // return BaseResult.fail(500, Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
        return e.getBindingResult().getFieldError().getDefaultMessage();
    }
}

不需要写BindingResult 也可以返回message

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 由@NotNull注解引出的关于Java空指针的控制

    Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键."预防好过治疗"这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的

  • spring 注解验证@NotNull等使用方法

    本文介绍了spring 注解验证@NotNull等使用方法,分享给大家,具体如下: 常用标签 @Null  被注释的元素必须为null @NotNull  被注释的元素不能为null @AssertTrue  被注释的元素必须为true @AssertFalse  被注释的元素必须为false @Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value)

  • @NotEmpty、@NotBlank、@NotNull的区别

    在网上搜索的内容,大致如下: 验证框中@NotEmpty.@NotBlank.@NotNull乍一看还是容易弄混的.主要使用情况记录一下: @NotEmpty 用在集合类上面 @NotBlank 用在String上面 @NotNull    用在基本类型上 只有简单的结果,但是再更具体一点的内容就搜不到了,所以去看了看源码,发现了如下的注释: 1. @NotEmpty 复制代码 代码如下: /** * Asserts that the annotated string, collection,

  • 校验非空的注解@NotNull如何取得自定义的message

    目录 校验非空的注解@NotNull如何取得自定义的message 用法:定义一个全局异常处理 @NotNull 等注解的简单使用 2.3以前则不需要引入maven包 Controller层 附上 部分注解 校验非空的注解@NotNull如何取得自定义的message 由于项目表单需要校验字段过多,一个一个去判空太麻烦,所以用了@NotNull注解,字段为空会抛出MethodArgumentNotValidException异常. 接下来要取得@NotNull(message="自定义异常&qu

  • SpringBoot中自定义注解实现参数非空校验的示例

    前言 由于刚写项目不久,在写 web 后台接口时,经常会对前端传入的参数进行一些规则校验,如果入参较少还好,一旦需要校验的参数比较多,那么使用 if 校验会带来大量的重复性工作,并且代码看起来会非常冗余,所以我首先想到能否通过一些手段改进这点,让 Controller 层减少参数校验的冗余代码,提升代码的可阅读性. 经过阅读他人的代码,发现使用 annotation 注解是一个比较方便的手段,SpringBoot 自带的 @RequestParam 注解只会校验请求中该参数是否存在,但是该参数是

  • 使用注解@Validated和BindingResult对入参进行非空校验方式

    目录 注解@Validated和BindingResult对入参非空校验 @Validated 和 BindingResult 使用遇到的坑 注解@Validated和BindingResult对入参非空校验 在项目当中少不了入参校验,服务器和浏览器互不信任,不能因为前端加入参判断了后台就不处理了,这样是不对的. 比如前台传过来一个对象作为入参参数,这个对象中有些属性允许为空,有些属性不允许为空.那么你还在使用if()else{}进行非空判断吗?不妨尝试下使用注解,可以使用@Validated和

  • 使用自定义注解+springAop实现参数非空校验方式

    目录 自定义注解+springAop参数非空校验 新建注解类@interface ParamsVerify 利用springAop来实现切面 新建一个切面类 使用注解统一校验参数非空 1. 待校验类 2. 注解类 3. 校验 自定义注解+springAop参数非空校验 自定义注解,来对对应的方法进行入参校验,为空返回参数错误 新建注解类@interface ParamsVerify @Target(ElementType.METHOD)//枚举,表示注解可能出现在的地方 @Retention(R

  • 快速校验实体类时,@Valid,@Validated,@NotNull注解无效的解决

    目录 校验实体类参数内容不能为空时使用注解校验无效 使用@valid注解首先引入依赖 1.更换方法入参类型 2.错误内容过多 3.使用对象接收错误内容,按自己要求输出 springboot 校验机制 @Validated @Valid 1.探究原因 2.使用@Validated 实现校验机制 3.使用@Valid 实现校验机制 校验实体类参数内容不能为空时使用注解校验无效 使用@valid注解首先引入依赖 如果是SpringBoot项目,引入web开发包,就不需要再单独引入@valid依赖了.因

  • 参数校验Spring的@Valid注解用法解析

    参数校验Spring的@Valid注解 @Valid 注解通常用于对象属性字段的规则检测. 以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 注解用法详解. 那么,首先,我们会有一个员工对象 Employee,如下 : public class Employee { /** 姓名 */ public String name; /** 年龄 */ public Integer age; public String getName() { return name; } publ

  • java 如何复制非空对象属性值

    目录 java 复制非空对象属性值 然后封装一下得到以下方法 测试方法就不提供了,自行测试即可 java对象属性复制的几种方式 1.使用java反射机制 2.使用spring-beans5.0.8包中的BeanUtils类 3.使用cglib3.2.8包中的net.sf.cglib.beans.BeanCopier类 4.使用spring-core5.0.8包 java 复制非空对象属性值 很多时候,我们需要通过对象拷贝,比如说VO类与数据库实体bean类.更新时非空对象不更新,对同一对象不同数

  • 浅谈C#9.0新特性之参数非空检查简化

    参数非空检查是缩写类库很常见的操作,在一个方法中要求参数不能为空,否则抛出相应的异常.比如: public static string HashPassword(string password) { if(password is null) { throw new ArgumentNullException(nameof(password)); } ... } 当异常发生时,调用者很容易知道是什么问题.如果不加这个检查,可能就会由系统抛出未将对象引用为实例之类的错误,这不利于调用者诊断错误. 由

  • JS非空验证及邮箱验证的实例

    非空验证 <body> <table> <tr> <td>姓名:</td> <td><input type="text" name="TrueName" id="TrueName" /></td> </tr> ....省略其他input <tr> <td colspan="2"> <inpu

  • asp.net FCKeditor自定义非空验证

    需要提交两次才能通过.解决的办法是禁用RequiredFieldValidator控件的客户端脚本验证功能.只在服务器端验证. 复制代码 代码如下: <asp:RequiredFieldValidator ID="RequiredFieldValidator16" runat="server" ControlToValidate="fck" Display="Dynamic" EnableClientScript=&qu

随机推荐