Bean Validation

validator 自动化校验

醉酒当歌 提交于 2021-02-11 13:30:48
温馨提示 请收藏再看。此文篇幅太长,你短时间看不完;此文干货太多,错过太可惜。 示例代码可以关注 逸飞兮 (公众号)回复 jy 获取。 收获 讲解详细:能让你掌握使用 hibernate-validator 及类似校验工具的各种使用姿势 内容全面:可以当做知识字典来查询 what 注意:hibernate-validator 与 持久层框架 hibernate 没有什么关系,hibernate-validator 是 hibernate 组织下的一个 开源项目 。 hibernate-validator 是 JSR 380(Bean Validation 2.0) 、 JSR 303(Bean Validation 1.0) 规范的实现。 JSR 380 - Bean Validation 2.0 定义了一个实体和方法验证的元数据模型和 API。 JavaEE(改名为:Jakarta EE)中制定了 validation 规范,即:javax.validation-api(现为 jakarta.validation-api,jar 包的名字改变,包里面的包名、类名未变,因此使用方式不变)包, spring-boot-starter-web 、 spring-boot-starter-webflux 包都已引入此依赖,直接使用即可。 有点类似于 slf4j 与 logback

Spring MVC----Validation(数据校验)

这一生的挚爱 提交于 2021-02-11 11:40:50
简化服务器验证 JSR-303 简介 JSR-303 是 JavaEE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是 Hibernate Validator。 此实现与 Hibernate ORM 没有任何关系。JSR-303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中使用注解的方式对表单提交的数据方便地验证。 Spring 4.0 开始支持 Bean Validation 功能。 JSR-303 基本的校验规则 空检查 @Null 验证对象是否为 null @NotNull 验证对象是否不为 null , 无法查检长度为 0 的字符串 @NotBlank 检查约束字符串是不是 Null 还有被 Trim 的长度是否大于 0,只对字符串,且会去掉前后空格 @NotEmpty 检查约束元素是否为 NULL 或者是 EMPTY 布尔检查 @AssertTrue 验证 Boolean 对象是否为 true @AssertFalse 验证 Boolean 对象是否为 false 长度检查 @Size(min=, max=) 验证对象( Array , Collection , Map , String )长度是否在给定的范围之内 @Length(min=, max=)

一文教你实现 SpringBoot 中的自定义 Validator 和错误信息国际化配置

有些话、适合烂在心里 提交于 2021-01-29 11:18:19
点击上方 蓝色字体 ,关注我 —— 一个在阿里云打工的 清华 学渣 ! 本文通过示例说明,在 Springboot 中如何自定义 Validator,以及如何实现国际化的错误信息返回。注意,本文代码千万别直接照抄,有可能会出大事情的。先留个悬念,读者朋友们能从中看出有什 么问题吗? 项目初始化入 直接从 springboot 官网中下载模板,直接通过示例中的 GreetingController 添加实现逻辑。 @RestController public class GreetingController { private static final String template = "Hello, %s!" ; private final AtomicLong counter = new AtomicLong(); @RequestMapping ( "/greeting" ) public Response<Greeting> greeting (@RequestParam(value = "name" , defaultValue = "World" ) String name) { if (! "tangleithu" .equals(name)) { throw new BadRequestException( "user.notFound" ); } return

一文教你实现 SpringBoot 中的自定义 Validator 和错误信息国际化配置

若如初见. 提交于 2021-01-29 04:31:28
一文教你实现 SpringBoot 中的自定义 Validator 和错误信息国际化配置 码农唐磊 程序猿石头 本文通过示例说明,在 Springboot 中如何自定义 Validator,以及如何实现国际化的错误信息返回。注意,本文代码千万别直接照抄,有可能会出大事情的。先留个悬念,读者朋友们能从中看出有什么问题吗? 项目初始化入 直接从 springboot 官网中下载模板,直接通过示例中的 GreetingController 添加实现逻辑。 @RestController public class GreetingController { private static final String template = "Hello, %s!"; private final AtomicLong counter = new AtomicLong(); @RequestMapping("/greeting") public Response<Greeting> greeting(@RequestParam(value = "name", defaultValue = "World") String name) { if (!"tangleithu".equals(name)) { throw new BadRequestException("user.notFound"); }

Java项目笔记之秒杀功能

ぃ、小莉子 提交于 2021-01-03 12:01:34
不点蓝字,我们哪来故事? 秒杀功能 参数校验 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定。 用 JSR 303 – Bean Validation 规范 : Bean Validation 中的 constraint 表 1. Bean Validation 中内置的 constraint Constraint 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @DecimalMax(value) 被注释的元素必须是一个数字

5. 穿过拥挤的人潮,Spring已为你制作好高级赛道

自闭症网瘾萝莉.ら 提交于 2020-12-22 04:23:08
❝ 分享、成长,拒绝浅藏辄止。关注公众号【 BAT的乌托邦 】,回复关键字 专栏 有Spring技术栈、中间件等小而美的 原创专栏 供以免费学习。本文已被 https://www.yourbatman.cn 收录。 ❞ ✍前言 你好,我是YourBatman。 上篇文章 大篇幅把Spring全新一代类型转换器介绍完了,已经至少能够考个及格分。在介绍Spring众多内建的转换器里,我故意留下一个尾巴,放在本文专门撰文讲解。 为了让自己能在“拥挤的人潮中”显得不(更)一(突)样(出),A哥特意准备了这几个特殊的转换器助你破局,穿越拥挤的人潮,踏上Spring已为你制作好的高级赛道。 版本约定 Spring Framework:5.3.1 Spring Boot:2.4.0 ✍正文 本文的焦点将集中在上文留下的4个类型转换器上。 StreamConverter:将Stream流与集合/数组之间的转换,必要时转换元素类型 这三个比较特殊,属于“最后的”“兜底类”类型转换器: ObjectToObjectConverter:通用的将原对象转换为目标对象(通过工厂方法or构造器) IdToEntityConverter : 本文重点 。给个ID自动帮你兑换成一个Entity对象 FallbackObjectToStringConverter:将任何对象调用 toString()

Spring @Valid

我与影子孤独终老i 提交于 2020-11-23 20:50:39
@Valid基本用法 强烈推荐如果要学习@Valid JSR303, 建议看这里的API Bean Validation规范 ! Controller控制器中在需要校验的实体类上添加 @Valid 即可使用JSR303校验(前提记得添加hibernate-validator相关jar,<mvc:annotation-driven/>); modelMap是为了将校验失败信息写回到request属性中返回给JSP页面展示 @RequestMapping("/demo2") public String test2(@Valid User user, BindingResult result, ModelMap modelMap){ System.out.println(user); List<FieldError> fieldErrors = result.getFieldErrors(); for (FieldError e:fieldErrors) { System.out.println(e.getDefaultMessage()); //验证不通过的信息 System.out.println(e.getField()); modelMap.addAttribute(e.getField(),e.getDefaultMessage()); } return "test"; }

4. Validator校验器的五大核心组件,一个都不能少

杀马特。学长 韩版系。学妹 提交于 2020-10-29 10:53:55
> 困难是弹簧,你弱它就强。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的 专栏 供以免费学习。 ✍前言 你好,我是YourBatman。 上篇文章 介绍了校验器上下文ValidatorContext,知道它可以对校验器Validator的核心五大组件分别进行定制化设置,那么这些核心组件在校验过程中到底扮演着什么样的角色呢,本文一探究竟。 作为核心组件,是有必要多探究一分的。以此为基,再扩散开了解和使用其它功能模块便将如鱼得水。但是过程枯燥是真的,所以需要坚持呀。 版本约定 Bean Validation版本: 2.0.2 Hibernate Validator版本: 6.1.5.Final ✍正文 Bean Validation校验器的这五大核心组件通过ValidatorContext可以分别设置:若没设置(或为null),那就回退到使用ValidatorFactory默认的组件。 准备好的组件,统一通过ValidatorFactory暴露出来予以访问: public interface ValidatorFactory extends AutoCloseable { . . . MessageInterpolator getMessageInterpolator ( ) ;

如何解决代码中if…else 过多的问题

谁都会走 提交于 2020-08-16 17:34:33
前言 if...else 是所有高级编程语言都有的必备功能。但现实中的代码往往存在着过多的 if...else。虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性、可维护性造成很大伤害,进而危害到整个软件系统。现在软件开发领域出现了很多新技术、新概念,但 if...else 这种基本的程序形式并没有发生太大变化。使用好 if...else 不仅对于现在,而且对于将来,都是十分有意义的。今天我们就来看看如何“干掉”代码中的 if...else,还代码以清爽。 问题一:if...else 过多 问题表现 if...else 过多的代码可以抽象为下面这段代码。其中只列出5个逻辑分支,但实际工作中,能见到一个方法包含10个、20个甚至更多的逻辑分支的情况。另外,if...else 过多通常会伴随着另两个问题:逻辑表达式复杂和 if...else 嵌套过深。对于后两个问题,本文将在下面两节介绍。本节先来讨论 if...else 过多的情况。 1 if (condition1) { 2 3 } else if (condition2) { 4 5 } else if (condition3) { 6 7 } else if (condition4) { 8 9 } else { 10 11 } 通常,if...else 过多的方法,通常可读性和可扩展性都不好

Spring动态注册bean

怎甘沉沦 提交于 2020-08-11 18:26:53
为什么需要动态注册bean 大部分时候,静态的配置信息即可满足系统需求。但是某些场景下,我们需要根据静态配置中的信息动态生成bean,此时就需要动态注册bean的功能。 如: 用户定义一个如下的接口,而接口的实现则由框架生成,不需要用户自行编写,此时实现类就需要动态注册到容器中。 @Rest ( "http://localhost:8081/test" ) public interface IRequestDemo { @GET ResultBean get1 (); @GET ( "/get2" ) ResultBean getWithKey ( @Param ( "key" ) String key ); @GET ( "/get3" ) ResultBean getWithMultKey ( @Param ( "key1" ) String key , @Param ( "key2" ) String key2 ); } @componet public class test { @Autowired IRequestDemo demo ; public String test () { String msg = "<h1>invoke remote rest result</h1>" ; ResultBean get1 = demo . get1 (); msg += "