@Validated注解使用

@Validated注解使用@ValidatedpublicStringsyncTable(@ValidatedSyncByTableRequestrequest){logger.debug("request_info:"+JsonUtil.toJson(request));Stringresponse=Response.success(syncService….

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Spring-Boot-Validation

什么是Validation

在我们的RESTful Service中帮助我们完成期望的数据校验,通过配置Validation可以很轻松的完成对数据的约束
在我们接收到不想要的数据时:

  • 返回错误的状态码和错误的提示信息
  • 在响应的结果中去除敏感信息

错误的状态码

返回的响应码推荐使用400->bad request.

引导使用正确的REST资源

通过提供的报错信息来引导合理使用restful服务的资源,并且完成CRUD方法的调用.

通过Validation我们可以使用一种相同的模板方法来完成异常控制

在SpringBoot中使用Validation

错误的相应类型

如果你是用的是application/xml的处理类型,SpringBoot将默认返回状态码为415的Media Type.

无效的JSON内容

如果你发送了一个无效的JSON内容,你会的到状态码为400的Bad Request.

数据缺失的JSON

如果你的请求JSON中缺失数据,springboot将返回201状态码给你.

自定义Validation

接下来将使用Hibernate自带的Validatior来自定义一套Bean的Validator API.

在SpringBoot的项目中使用Hibernate的Validator是非常容易的

在Bean上通过Validations 注解实现

使用@Size注解来指定数据的长度和报错是提示的内容

@Entity
public class Student { 
   
  @Id
  @GeneratedValue
  private Long id;
  
  @NotNull
  @Size(min=2, message="Name should have atleast 2 characters")
  private String name;
  
  @NotNull
  @Size(min=7, message="Passport should have atleast 2 characters")
  private String passportNumber;

Jetbrains全家桶1年46,售后保障稳定

这里将可以使用到的注解放在下面一遍查看也可以看我的另一篇博客

空检查

@Null       验证对象是否为null

@NotNull    验证对象是否不为null, 无法查检长度为0的字符串

@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.

@NotEmpty 检查约束元素是否为NULL或者是EMPTY.



Booelan检查

@AssertTrue     验证 Boolean 对象是否为 true  

@AssertFalse    验证 Boolean 对象是否为 false  



长度检查

@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  

@Length(min=, max=) Validates that the annotated string is between min and max included.



日期检查

@Past           验证 Date 和 Calendar 对象是否在当前时间之前  

@Future     验证 Date 和 Calendar 对象是否在当前时间之后  

@Pattern    验证 String 对象是否符合正则表达式的规则



数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null

@Min            验证 Number 和 String 对象是否大等于指定的值  

@Max            验证 Number 和 String 对象是否小等于指定的值  

@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度

@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度

@Digits     验证 Number 和 String 的构成是否合法  

@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。



@Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.

@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;



@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)

@CreditCardNumber信用卡验证

@Email  验证是否是邮件地址,如果为null,不进行验证,算通过验证。

@ScriptAssert(lang= ,script=, alias=)

@URL(protocol=,host=, port=,regexp=, flags=)

在请求的时候进行Valid配置

post请求对于post在使用@Valid的时候需要在注解后跟随@RequestBoday,如果使用url传参,使用@Valid的时候也需要使用@RequestParam

public ResponseEntity<Object> createStudent(@Valid @RequestBody Student student) { 
   

get请求同理,直接使用@Valid+@RequestParam就可以了
这是对接口发出请求,我们可以看到服务返回了404的Bad Request

@GetMapping("/type/{type}/{year}")
	public Object selectRootByType(@NotNull(message = "结构层级不能为空!") @PathVariable("type") ExamTypeEnum type,
			@NotNull(message = "年份不能为空!") @PathVariable("year") Integer year) 
  {
    "name": "",
    "passportNumber": "A12345678"
  }

但是并没有返回给我们相关的提示信息.

  • 消费者知道这是一个Bad Request
  • 但是他们不知道为什么错了?那个元素出错了?为了解决这个错误该如何解决呢?

自定义Validation Response

首先需要创建一个简单的错误相应Bean

public class ErrorDetails { 
   
  private Date timestamp;
  private String message;
  private String details;

  public ErrorDetails(Date timestamp, String message, String details) { 
   
    super();
    this.timestamp = timestamp;
    this.message = message;
    this.details = details;
  }
通过继承ResponseEntityExceptionHandler来自定义异常处理类,需要在类上添加注解@ControllerAdvice
@ControllerAdvice
@RestController
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { 
   
通过ErrorDetails来封装错误信息并且将错误信息通过json的形式返回给前段进行展示
@ControllerAdvice
@RestController
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { 
   
  @ExceptionHandler(StudentNotFoundException)
  public final ResponseEntity<ErrorDetails> handleUserNotFoundException(StudentNotFoundException ex, WebRequest request) { 
   
    ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(),
        request.getDescription(false));
    return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
  }
如果请求的时候提供一个错误的参数,你讲收到后台发来的提示
{
    "name": "",
    "passportNumber": "A12345678"
  }

响应结果

{
    "timestamp": "2018-12-13T14:02:24.066+0000",
    "message": "Validation Failed",
    "details": "org.springframework.validation.BeanPropertyBindingResult: 1 errors\nField error in object 'student' on field 'name': rejected value []; codes [Size.student.name,Size.name,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [student.name,name]; arguments []; default message [name],2147483647,2]; default message [用户名长度不能小于2]"
}

自定义Validators

JSR 303验证提供可很多默认的验证模式,但是有的时候我们还是需要根据自己的需求自定义验证器

javax 提供了一个validation包用来帮助我们完成参数校验

如果想要实现自己的Validator就必须要实现ConstraintValidator,实现这个类可以帮助我们在解析参数时通过@Valid标注的方法参数进行验证

public class InRangeValidator implements ConstraintValidator<InRange, Integer> { 
   

    private int min;
    private int max;

    /** * 用来完成将注解中的内容初始化 */
    @Override
    public void initialize(InRange constraintAnnotation) { 
   
        this.min = constraintAnnotation.min();
        this.max = constraintAnnotation.max();
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) { 
   
        return value == null || (value >= min && value <= max);
    }
}

实现自己的注解也是很容易,只需要添加Constraint注解来实现对注解的约束,同时定义默认值和默认的错误消息

@Target({ 
   ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = { 
    InRangeValidator.class })
public @interface InRange { 
   
    String message() default "Value is out of range";
 
    Class<?>[] groups() default { 
   };
 
    Class<? extends Payload>[] payload() default { 
   };
 
    int min() default Integer.MIN_VALUE;
 
    int max() default Integer.MAX_VALUE;
}

高级使用

@Validator一系列注解不仅仅给我们提供了默认的信息提示以及相应的参数比较.同时还在注解中定义了groups的概念,通过引入自定义interface可以创建一些显示的声明从而帮助我们完成更好的验证

设置分组

在注解参数Group中添加interface的方法名来区分组别

  @PostMapping
    public Object insert(@RequestBody @Validated(value = { 
   ValidateGroups.ValidateSave.class}) PositionInfoDto.Save save) { 
   
        return testService.insert(save);
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216556.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea激活吗【2021免费激活】「建议收藏」

    (idea激活吗)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月29日
    51
  • bigdecimal保留小数位数_如何保留两位小数

    bigdecimal保留小数位数_如何保留两位小数packagecom.algorithms;importjava.math.BigDecimal;importjava.util.Scanner;/***调和级数求和*@authorLYY**/publicclassTiaoHeJiShuTest{publicstaticvoidmain(String[]args){System

    2025年12月9日
    2
  • 服务器系统tcpip.sys,tcpip.sys

    服务器系统tcpip.sys,tcpip.systcpip sys 文件说明 tcpip sys 文件是系统库中一个十分重要的文件 如果缺少了这款 tcpip sys 文件 您的设备或者电脑将会出现蓝屏或者无法开机的情况 马上下载 tcpip sys 这款文件修复吧 tcpip sys 官方版是系统中自带的文件 Tcpip sys 是微软使用的 TCP 并发连接数限制文件 默认值为 10 非常重要 很多朋友可能遇到 tcpip sys 导致的蓝屏 系统黑屏无法启动的问题

    2025年9月25日
    4
  • linux中的sleep函数和delay函数

    linux中的sleep函数和delay函数对于做过单片机程序的朋友来说,delay是很常见的函数,通常就是while或者for循环,进行空指令的执行,由于单片机的晶振固定,一个机器周期的时间是固定的,执行多少个空指令,就可以完成多少个机器周期时长的延时。其实在linux中的delay函数,道理是一样的,都是通过cpu执行空指令来达到延时的目的,但是对于操作系统这种多线程进行的方式来说,在需要延时的时候,可以通过将进程挂起的方式来实现延时。这就是sleep函数。sleep和delay的区别最明显也最重要的区别就是,在执行delay的时候,是执行

    2022年5月18日
    39
  • 如何制作bom表_如何制作bom表

    如何制作bom表_如何制作bom表(全路径Excel软件视频教程都可领取会员后免费学习)点我领会员免费学Excel全套基础入门教程!一、Excel软件入门MicrosoftExcel是Microsoft为使用Windows和AppleMacintosh操作系统的电脑编写的一款电子表格软件。直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,使Excel成为最流行的个人计算机数据处理软件。第一章软件入门介绍第1课软件…

    2022年8月29日
    4
  • ImportError: No module named bz2问题解决方法「建议收藏」

    ImportError: No module named bz2问题解决方法「建议收藏」问题:File”out/host/Linux-x86/obj/EXECUTABLES/mksnapshot.arm_intermediates/js2c.py”,line36,in  importbz2ImportError:Nomodulenamedbz2Traceback(mostrecentcalllast): File”out

    2022年6月1日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号