@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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分享一个好用的Python在线编辑器

    分享一个好用的Python在线编辑器原文:https://lwebapp.com/zh/python-online需求有小伙伴可能听说过PyScript,知道了Python可以通过打包成wasm运行在浏览器端了,这样做一些需要Python来做的功能,可以直接在浏览器完成,无需和服务器交互,打开了开发者的想象力。这里我们要推荐的是一个在线工具,也是支持Python代码的执行,一个在线的Python代码编辑器Python在线编辑器地址:https://lwebapp.com/zh/python-playground如何使用Py

    2022年8月14日
    3
  • java 字符数组 合并_字符数组合并?c数组合并?java数组合并问题「建议收藏」

    java 字符数组 合并_字符数组合并?c数组合并?java数组合并问题「建议收藏」本文关键词数组合并,由教案网整理发布publicstaticString[]getOneArray(){String[]a={“0″,”1″,”2”};String[]b={“0″,”1″,”2”};String[]c=newString[a.length+b.length];for(intj=0;j<a.length;++j)…

    2022年6月23日
    28
  • C# 串口通信 stm32 电机

    C# 串口通信 stm32 电机前几天已经完成了stm32通过PWM对电机的控制,这几天趁上班之余,也完成了c#通过串口通信控制电机的运行。界面如下好久没写文章了,发现非常不擅长分享和表达,第一反应是演示出来,可惜这里不能有动画,功能不强大啊。哪天有空了,把上位机代码和下位机代码上传上来。代码已经上传,请查看我的资源页。…

    2022年6月3日
    33
  • php中接口、抽象类以及接口和抽象类区别详解

    php中接口、抽象类以及接口和抽象类区别详解php中接口、抽象类以及接口和抽象类区别详解

    2022年4月24日
    44
  • 直接计算下面两个序列的卷积和_快速解锁键盘是哪个键

    直接计算下面两个序列的卷积和_快速解锁键盘是哪个键算法70—-只有两个键的键盘【动态规划】

    2022年4月21日
    52
  • 数电设计-八路抢答器

    1设计要求设计一个能支持八路抢答的智力竞赛抢答器;主持人按下开始抢答的按键后,有短暂的报警声提示抢答人员抢答开始且指示灯亮表示抢答进行中;在开始抢答后数码管显示30秒倒计时;有抢答人员按下抢答键后,在数码管上显示抢答成功人员的编号,倒计时暂停,同时后续抢答人员的抢答将无效;当主持人再次按下按键回到复位状态,倒计时的数码管保持显示30,显示人员编号的数码管灭,指示灯灭。利用数字电路设计一个八路抢答器,允许八路参加,并具有锁定功能,用LED显示最先抢答的队号码,系统设置外部清除键,按动清除键,LE.

    2022年4月5日
    137

发表回复

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

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