Java笔记 #07# Hibernate Validator
Hibernate Validator是Spring Boot默认附带的标准校验API(javax.validation)实现。
应用实例(配合切面)
采用注解定义切面.java
@Aspect
@Configuration
public class ParameterValidator { private ExecutableValidator executableValidator; public ParameterValidator() {
// 开启快速失败返回模式(顾名思义...)
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).
configure().addProperty("hibernate.validator.fail_fast", "true" ).
buildValidatorFactory();
executableValidator = validatorFactory.getValidator().forExecutables();
} @Pointcut("execution(public * org.sample.website.service.impl.*.*(..))")
public void serviceMethod() {} @Around("serviceMethod()")
public Object validate(ProceedingJoinPoint jp) throws Throwable {
Method method = ((MethodSignature) jp.getSignature()).getMethod();
Set<ConstraintViolation<Object>> violations = executableValidator.validateParameters(jp.getThis(), method, jp.getArgs());
if (!violations.isEmpty()) {
throw new ValidationException(violations.iterator().next().getMessage());
}
return jp.proceed();
}
}
PS. ValidationException是标准API中定义的运行时异常
/
接口.java
public interface MessageService {
// 单独校验参数
Message leaveMessage(@NotNull(message = "昵称不能为空") String nickname,
@NotNull(message = "内容不能为空") String content);
Message leaveMessage(@Valid Message message); // 校验实体
List<Message> listMessage(int offset, int limit);
}
/
参数中的实体只有在@Valid(递归校验符)标注后才会被校验:
public class Message {
private Long id;
private String nickname;
@NotNull(message = "内容不能为空!")
private String content;
public Message() {
}
/
测试代码片段(Spring环境):
String nickname = "test" + (int) (Math.random() * 10);
messageService.leaveMessage(new Message(nickname, null));
运行结果:
javax.validation.ValidationException: 内容不能为空!
at org.sample.website.aspect.ParameterValidator.validate(ParameterValidator.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
参考资料
- 在系统中使用Bean Validation验证参数
- springboot使用hibernate validator校验
- Hibernate Validator 校验方法的参数,返回值,构造函数
- http://hibernate.org/validator/documentation/
Java笔记 #07# Hibernate Validator的更多相关文章
- java后台校验 hibernate validator
链接 : https://www.cnblogs.com/softidea/p/6044123.html
- hibernate Validator 6.X 的学习,bean的约束(字段,get方法上的验证)
一:背景说明 验证数据是一个常见的任务,它贯穿于所有应用层,从呈现到持久层.通常在每个层中都执行相同的验证逻辑,耗时且容易出错.为了避免这些验证的重复,开发商往往把验证逻辑直接进入的领域模型,在领域类 ...
- org.hibernate.validator.constraints.NotBlank' validating type 'java.lang.Integer
使用hibernate时,在save方法时,报了:org.hibernate.validator.constraints.NotBlank' validating type 'java.lang.In ...
- JAVA自学笔记07
JAVA自学笔记07 1.构造方法 1) 例如:Student s = new Student();//构造方法 System.out.println(s);// Student@e5bbd6 2)功 ...
- hibernate 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.xxx 这类的问题
<!-- 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.intern ...
- hibernate.validator.constraints.NotEmpty校验请求参数报错java.lang.NoClassDefFoundError: javax/el/PropertyNotFoundException
spring maven项目,使用hibernate validator 注解形式校验客户端的请求参数. hibernate-validator版本:5.0.2.Final validation-ap ...
- Caused by: java.lang.AbstractMethodError: org.hibernate.validator.internal.engine.ConfigurationImpl
1.错误描述 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error ...
- java.lang.NoClassDefFoundError: org/hibernate/validator/internal/engine/DefaultClockProvider
①在springboot的spring-boot-starter-web默认引入了以下依赖: <dependency> <groupId>com.fasterxml.jacks ...
- Java:并发笔记-07
Java:并发笔记-07 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 6. 共享模型之不可变 本章内容 不可变类的使用 不可变类设计 无状态类设计 6.1 ...
随机推荐
- php 获取 两个时间戳之间 相隔 【多少年】 【 多少个月】 【多少天】 【 多少个小时】 【多少分】【 多少秒 】
/** * 返回两个时间的相距时间,*年*月*日*时*分*秒 * @param int $one_time 时间戳一 大的时间戳 * @param int $two_time 时间戳二 小的时间戳 * ...
- 数学和物理太难?这些 GIF 让你秒懂抽象概念
把科学带回家,给孩子最好的科学教育 觉得数学和物理很抽象很难懂吗?今天我们来分享一组数学和物理相关的动图,让你秒懂抽象概念. 数学动图 △ 从椭圆的一个焦点射出的光线总会通过另一个焦点. △ 真人版. ...
- Spring Boot2.1.3全局跨域
/** * 配置跨域访问 * * @author Terwer */ @Bean public WebMvcConfigurer corsConfigurer() { return new WebMv ...
- nodejs实时的检测系统文件的变化(无需重启服务)
1.安装superior npm -g install supervisor 注意 superior必须全局安装,否则错误命令会提示安装到全局 2.修改启动 现在我们需要使用 supervisor a ...
- VUE-008-通过路由 router.push 传递 query 参数(路由 path 识别,请求链接显示参数传递)
在前端页面表单列表修改时,经常需要在页面切换的时候,传递需要修改的表单内容,通常可通过路由进行表单参数的传递. 首先,配置页面跳转路由.在 router/index.js 中配置相应的页面跳转路由,如 ...
- CF1139D Steps to One
题目链接:洛谷 这个公式可真是个好东西.(哪位大佬知道它叫什么名字的?) 如果$X$恒$\geq 0$,那么 $$E[X]=\int_0^{+\infty}P(X>t)dt$$ 呸,我什么都没写 ...
- __add__,关于运算符重载(用户权限)
1.首先定义三种用户类型:普通用户.管理员.超级管理员,不同用户类型的用户权限关系如下: 先看一段代码: class Scope(): # 定义一个基类,因为每个权限类都需要add()方法 allow ...
- CentOS系统/tmp目录里面的文件默认保留多久
一.CentOS系统/tmp目录里面的文件默认保留多久 CentOS6默认保留30天,CentOS7默认保留10天 一.CentOS7系统/tmp目录里面的文件默认保留多久 CentOS7默认保留10 ...
- [LeetCode] 115. Distinct Subsequences_ Hard tag: Dynamic Programming
Given a string S and a string T, count the number of distinct subsequences of S which equals T. A su ...
- zlib简单使用说明(转)
1.背景:项目需要把protobuf文件压缩后再传到MQTT,于是就想到了zlib 2.zlib是提供数据压缩用的函式库,此函式库为自由软件. 3.网上下载zlib压缩包,执行如下命令,函数库就可使用 ...