「java参数校验」java参数校验写在哪
本篇文章给大家谈谈java参数校验,以及java参数校验写在哪对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Springboot通过切面校验参数完整性
- 2、java 判断所有参数是否为空
- 3、validation校验
- 4、SpringBoot 参数校验,高级特性,非常实用
- 5、java 方法参数怎么优雅校验
- 6、遇到校验问题,java.lang.VerifyError
Springboot通过切面校验参数完整性
写在前面:项目所有的HTTP请求参数均为JSON,故本文的校验方法也以此为基础,如果想要校验其他类型的参数,可根据实际情况修改。
依据上述response格式,定义JAVA实体类如下:
切面的要求是:JSON正确且参数完整时,继续执行添加了注解的方法,JSON不正确或参数不完整时,直接返回缺失的参数。因此切面必须使用注解@Around,通过proceedingJoinPoint获取请求参数(如果是@Before或者@After则是JoinPoint),之后先校验JSON合法性,再检查确实参数。
java 判断所有参数是否为空
方法一:
先把int类型的数据转换成String类型,然后判断String类型的数据是否为空。
示例代码:
int point;
String val=point +"";
if("".equals(val)){
// do something...
}
PS:int point不是对象,int类型为空时默认为0。
方法二:
如果point是int类型,则得到的结果是不可能是null的。
如果插入一条数据时没有插入给字段,而数据库里默认是null的值的话,可以使用
Integer point= GiftInfo.getPoints();
然后判断point是否等于空。
示例代码:
Integer point= GiftInfo.getPoints();
if(point == null){
// do something...
}
PS:GiftInfo.getPoints返回的是Integer类型,Integer类型是包括基本类型的包装类,不给赋值的时候为null。
validation校验
(1)控制层controller:效验页面请求的参数的合法性,在服务端控制层conroller校验,不区分客户端类型(浏览器、手机客户端、远程调用)
(2)业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。
(3)持久层dao:一般是不校验的。
页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。
(1) 需要的jar包(maven):
(2) 在SpringMVC配置文件中添加配置校验器
(3) 校验器注入到处理器适配器中
(4) 在pojo校验错误信息
(5) 在CustomValidationMessages.properties配置校验错误信息
(6) 捕获和显示校验错误信息
(7) 页面显示
在配置完成validation校验后,无法正确显示CustomValidationMessages.properties配置中的信息,显示为实体类中配置效验的路径。猜测可能没有去调用properties配置文件。
定义多个校验分组(其实是一个java接口),分组中定义有哪些规则
每个controller方法使用不同的校验分组
(1)校验分组
(2)在校验规则中添加分组
(3)在controller方法使用指定分组的校验
(1)springmvc默认对pojo数据进行回显
pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写)
使用@ModelAttribute指定pojo回显到页面request中的key
(2)@ModelAttribute还可以将方法的返回值传到页面
controller
jsp
(3)最简单的数据回显model(不使用@ModelAttribute)
SpringBoot 参数校验,高级特性,非常实用
之前也写过一篇关于 Spring Validation 使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂 Spring Validation 。
本文会详细介绍 Spring Validation 各种场景下的最佳实践及其实现原理,死磕到底!
Java API 规范 ( JSR303 ) 定义了 Bean 校验的标准 validation-api ,但没有提供实现。 hibernate validation 是对这个规范的实现,并增加了校验注解如 @Email 、 @Length 等。 Spring Validation 是对 hibernate validation 的二次封装,用于支持 spring mvc 参数自动校验。接下来,我们以 spring-boot 项目为例,介绍 Spring Validation 的使用。
如果 spring-boot 版本小于 2.3.x , spring-boot-starter-web 会自动传入 hibernate-validator 依赖。如果 spring-boot 版本大于 2.3.x ,则需要手动引入依赖:
对于 web 服务来说,为防止非法参数对业务造成影响,在 Controller 层一定要做参数校验的!大部分情况下,请求参数分为如下两种形式:
下面我们简单介绍下 requestBody 和 requestParam/PathVariable 的参数校验实战!
POST 、 PUT 请求一般会使用 requestBody 传递参数,这种情况下,后端使用** DTO 对象 进行接收。 只要给 DTO 对象加上 @Validated 注解就能实现自动参数校验**。比如,有一个保存 User 的接口,要求 userName 长度是 2-10 , account 和 password 字段长度是 6-20 。如果校验失败,会抛出 MethodArgumentNotValidException 异常, Spring 默认会将其转为 400(Bad Request) 请求。
DTO 表示数据传输对象(Data Transfer Object),用于服务器和客户端之间交互传输使用的 。在 spring-web 项目中可以表示用于接收请求参数的 Bean 对象。
这种情况下, 使用 @Valid 和 @Validated 都可以 。
前面说过,如果校验失败,会抛出 MethodArgumentNotValidException 或者 ConstraintViolationException 异常。在实际项目开发中,通常会用 统一异常处理 来返回一个更友好的提示。比如我们系统要求无论发送什么异常, http 的状态码必须返回 200 ,由业务码去区分系统的异常情况。
在实际项目中,可能多个方法需要使用同一个 DTO 类来接收参数,而不同方法的校验规则很可能是不一样的。这个时候,简单地在 DTO 类的字段上加约束注解无法解决这个问题。因此, spring-validation 支持了 分组校验 的功能,专门用来解决这类问题。还是上面的例子,比如保存 User 的时候, UserId 是可空的,但是更新 User 的时候, UserId 的值必须 =10000000000000000L ;其它字段的校验规则在两种情况下一样。这个时候使用 分组校验 的代码示例如下:
前面的示例中, DTO 类里面的字段都是 基本数据类型 和 String 类型。但是实际场景中,有可能某个字段也是一个对象,这种情况先,可以使用 嵌套校验 。
比如,上面保存 User 信息的时候同时还带有 Job 信息。需要注意的是, 此时 DTO 类的对应字段必须标记 @Valid 注解 。
嵌套校验可以结合分组校验一起使用。还有就是 嵌套集合校验 会对集合里面的每一项都进行校验,例如 List 字段会对这个 list 里面的每一个 Job 对象都进行校验。
如果请求体直接传递了 json 数组给后台,并希望对数组中的每一项都进行参数校验。此时,如果我们直接使用 java.util.Collection 下的 list 或者 set 来接收数据,参数校验并不会生效!我们可以使用自定义 list 集合来接收参数:
@Delegate 注解受 lombok 版本限制, 1.18.6 以上版本可支持。如果校验不通过,会抛出 NotReadablePropertyException ,同样可以使用统一异常进行处理。
比如,我们需要一次性保存多个 User 对象, Controller 层的方法可以这么写:
业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。自定义 spring validation 非常简单,假设我们自定义 加密id (由数字或者 a-f 的字母组成, 32-256 长度)校验,主要分为两步:
这样我们就可以使用 @EncryptId 进行参数校验了!
上面的示例都是基于 注解 来实现自动校验的,在某些情况下,我们可能希望以 编程方式 调用验证。这个时候可以注入 javax.validation.Validator 对象,然后再调用其 api 。
Spring Validation 默认会校验完所有字段,然后才抛出异常。可以通过一些简单的配置,开启 Fali Fast 模式,一旦校验失败就立即返回。
在 spring-mvc 中, RequestResponseBodyMethodProcessor 是用于解析 @RequestBody 标注的参数以及处理 @ResponseBody 标注方法的返回值的。显然,执行参数校验的逻辑肯定就在解析参数的方法 resolveArgument() 中:
可以看到, resolveArgument() 调用了 validateIfApplicable() 进行参数校验。
看到这里,大家应该能明白为什么这种场景下 @Validated 、 @Valid 两个注解可以混用。我们接下来继续看 WebDataBinder.validate() 实现。
最终发现底层最终还是调用了 Hibernate Validator 进行真正的校验处理。
接着看一下 MethodValidationInterceptor :
实际上,不管是 requestBody参数校验 还是 方法级别的校验 ,最终都是调用 Hibernate Validator 执行校验, Spring Validation 只是做了一层封装 。
本人花费2个月时间,整理了一套JAVA开发技术资料,内容涵盖java基础,分布式、微服务等主流技术资料,包含大厂面经,学习笔记、源码讲义、项目实战、讲解视频。
java面试资料
私信回复【2022面试资料】
领取更多学习资料
java 方法参数怎么优雅校验
具体要看是传入的是什么类型的参数;
程序对参数有什么的要求;
比如说格式,长度,是否为空,是否为null。
遇到校验问题,java.lang.VerifyError
是说当“校验器”检测到一个类文件虽然格式正确,但包含着一些内部不一致性或安全性问题时,抛出该错误。
从你列出的信息这能看出这些信息
具体的你依据提示信息检查一下你的程序
jdk版本不一致
比如你用1.5的编译出来,然后去1.4运行就可能出现这样的问题。
1.4编译出来的,到1.5上运行就不会有这样的问题
关于java参数校验和java参数校验写在哪的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。