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 ...
随机推荐
- 剑指offer——python【第59题】按之子形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 这道题其实是分层打印二叉树的进阶版 ...
- Python 面试中可能会被问到的30个问题
第一家公司问的题目 1 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译.这样解释型语言每执行一次 ...
- linux-rhel7配置网卡bond双网卡主备模式
参考以下文章中的 2.centos7配置bonding: https://www.cnblogs.com/huangweimin/articles/6527058.html 以下是配置过程的操作和打印 ...
- 记录请求的耗时(拦截器、过滤器、aspect)
文章前言 记录控制器请求的耗时处理通常有三种实现方式,分别是:过滤器.拦截器.aspect:下文将逐一实现. 1.Filter 过滤器 1.1.方法说明 需要实现 Filter 类,主要涉及三个方法: ...
- Jenkins+Jmeter持续集成笔记(四:定时任务和邮件通知)
通过前几篇文章,jmeter+ant+jenkins自动化持续构建的测试平台基本成型.既然要自动化平台,最基本的肯定要实现不经过人工干预,平台会在特定的条件下自动运行测试脚本,并在脚本运行结束后,发送 ...
- C#开启异步 线程的四种方式
一.异步委托开启线程public static void Main(string[] args){ Action<int,int> a=add; a.BeginInvoke(3,4,nul ...
- vue中keep-alive使用时,注意要点
<keep-alive exclude="QRCode,NewsInfor,VipRecordDetail"> <router-view></rout ...
- 486A
#include <stdio.h> int main() { long long ans; long long n; scanf("%I64d", &n); ...
- Oracle安装和配置Oracle数据库快速指南
Oracle安装12C要求参考文档 汇总 中文版:在 Unix AIX,HP-UX,Linux,Solaris 和 MS Windows 操作系统上安装和配置 Oracle 数据库(RDBMS)的要求 ...
- ORA-27104: system-defined limits for shared memory was misconfigured与Linux内核参数配置有关的案例
```[oracle@WWJD01 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.2.0.1.0 Production on Fri Sep 21 15:1 ...