Bean Validation

参数校验这样写?就不会被劝退了

对着背影说爱祢 提交于 2020-08-11 16:51:57
背景 最近端午好久没有和二胖聚一聚了,于是约了二胖到人民广场去宰他一顿,正好最近他跳槽加薪了。<br/> 我 :二胖听说你最近跳槽了,并且还是从传统软件公司跳到了互联网公司,工资是不是涨了一点啊,今天你请客哈。<br/> 二胖 :别说了,工资是涨了点,但是性价比反而变低了,以前到点就下班,现在下班到家都快12点了。<br/> 我 :新公司怎么样还适应吗?除了上班时间久点。<br/> 二胖 :哎,这个还真稍微有点不适应,这不是刚进去没啥事, leader 就给我安排了一个简单的用户保存功能(参数校验),原来以前公司个把小时就做好了的功能,在这新公司硬是折腾了两三天,真是苦不堪言。我改了好几个版本最终 leader 才满意的点了点头。 接口裸奔 按照二胖在以前公司的写法再传统公司反正系统都是服务内部人员的,在后端写参数校验是不存在的事情,完全信赖前端传过来的内容。这不写完代码自测一把发现可以保存数据,就屁颠屁颠的发起代码 review 了(二胖在以前的公司代码 review 是不存在的,只要功能实现就好了)。正好 leader 今天有点时间,看到新同事提交的代码看看写的怎么样。 看着这个裸奔的接口, leader 把二胖叫了过去,语重心长的跟二胖说道:"你这个参数校验不写写吗?不怕人家***你的接口吗?这里不校验,直接用,不怕引入sql注入吗?这里不校验下邮箱是否符合格式吗

Spring Boot 使用 JSR303 实现参数验证

萝らか妹 提交于 2020-08-10 06:42:26
文章首发于公众号《程序员果果》 地址 : http://blog.itwolfed.com/blog/97 简介 JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation。 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定。 Bean Validation 为 JavaBean 验证定义了相应的元数据模型和 API。缺省的元数据是 Java Annotations,通过使用 XML 可以对原有的元数据信息进行覆盖和扩展。在应用程序中,通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以确保数据模型(JavaBean)的正确性。constraint 可以附加到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。Bean Validation 是一个运行时的数据验证框架

二胖写参数校验的坎坷之路

淺唱寂寞╮ 提交于 2020-08-06 00:59:08
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 作者丨java金融 来源丨java金融( java4299 ) 背景 最近端午好久没有和二胖聚一聚了,于是约了二胖到人民广场去宰他一顿,正好最近他跳槽加薪了。 我 :二胖听说你最近跳槽了,并且还是从传统软件公司跳到了互联网公司,工资是不是涨了一点啊,今天你请客哈。 二胖 :别说了,工资是涨了点,但是性价比反而变低了,以前到点就下班,现在下班到家都快12点了。 我 :新公司怎么样还适应吗?除了上班时间久点。 二胖 :哎,这个还真稍微有点不适应,这不是刚进去没啥事, leader 就给我安排了一个简单的用户保存功能,原来以前公司个把小时就做好了的功能,在这新公司硬是折腾了两三天,真是苦不堪言。我改了好几个版本最终 leader 才满意的点了点头。 接口裸奔 按照二胖在以前公司的写法再传统公司反正系统都是服务内部人员的,在后端写参数校验是不存在的事情,完全信赖前端传过来的内容。这不写完代码自测一把发现可以保存数据,就屁颠屁颠的发起代码 review 了(二胖在以前的公司代码 review 是不存在的,只要功能实现就好了)。正好 leader 今天有点时间,看到新同事提交的代码看看写的怎么样。看着这个裸奔的接口, leader

测试开发专题:如何在spring-boot中进行参数校验

这一生的挚爱 提交于 2020-07-29 09:09:24
上文我们讨论了spring-boot如何去获取前端传递过来的参数,那传递过来总不能直接使用,需要对这些参数进行校验,符合程序的要求才会进行下一步的处理,所以本篇文章我们主要讨论spring-boot中如何进行参数校验。 lombok使用介绍 在介绍参数校验之前,先来了解一下lombok的使用,因为在接下来的实例中或有不少的对象创建,但是又不想写那么多的getter和setter,所以先介绍一下这个很强大的工具的使用。 Lombok 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。 添加maven依赖 在pom文件中添加如下内容: <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> 基础注解 @Getter 给类增加get方法 @Setter 给类增加set方法 @Builder 给类增加构建者模式 @AllArgsConstructor 给类增加全参构造方法 @NoArgsConstructor 给类增加无参数构造方法 @RequiredArgsConstructor 按照必填属性增加构造方法

springmvc参数校验(二)

情到浓时终转凉″ 提交于 2020-05-08 05:34:03
一、PathVariable 校验 在定义 Restful 风格的接口时,通常会采用 PathVariable 指定关键业务参数,如下: @GetMapping( "/path/{group:[a-zA-Z0-9_]+}/{userid}") @ResponseBody public String path(@PathVariable( "group") String group, @PathVariable( "userid") Integer userid) { return group + ":" + userid; } {group:[a-zA-Z0-9_]+} 这样的表达式指定了 group 必须是以大小写字母、数字或下划线组成的字符串。 我们试着访问一个错误的路径: GET /path/testIllegal. get/ 10000 此时会得到 404 的响应,因此对于PathVariable 仅由正则表达式可达到校验的目的 二、方法参数校验 类似前面的例子,大多数情况下,我们都会直接将HTTP请求参数映射到方法参数上。 @GetMapping( "/param") @ResponseBody public String param(@RequestParam( "group")@Email String group, @RequestParam( "userid")

使用spring validation完成数据后端校验-自定义校验的注解-判断是否为空

南笙酒味 提交于 2020-05-08 03:36:11
引入依赖 我们使用maven构建springboot应用来进行demo演示。 < dependencies > < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-web </ artifactId > </ dependency > </ dependencies > 我们只需要引入spring-boot-starter-web依赖即可,如果查看其子依赖,可以发现如下的依赖: < dependency > < groupId > org.hibernate </ groupId > < artifactId > hibernate-validator </ artifactId > </ dependency > < dependency > < groupId > com.fasterxml.jackson.core </ groupId > < artifactId > jackson-databind </ artifactId > </ dependency > 验证了我之前的描述,web模块使用了hibernate-validation,并且databind模块也提供了相应的数据绑定功能。 构建启动类 无需添加其他注解

接近8000字的Spring/SpringBoot常用注解总结!安排!

生来就可爱ヽ(ⅴ<●) 提交于 2020-05-01 14:18:03
0.前言 大家好,我是 Guide 哥!这是我的 221 篇优质原创文章。如需转载,请在文首注明地址,蟹蟹! 本文已经收录进我的 75K Star 的 Java 开源项目 JavaGuide: https://github.com/Snailclimb/JavaGuide 相关阅读: V2.0 版本的 《JavaGuide面试突击版》来啦!带着它的在线阅读版本来啦! 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项目基本没啥大问题了! 整个目录如下,内容有点多: 为什么要写这篇文章? 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多,我看了文章内容之后属实觉得质量有点低,并且有点会误导没有太多实际使用经验的人(这些人又占据了大多数)。所以,自己索性花了大概 两天时间简单总结一下了。 因为我个人的能力和精力有限,如果有任何不对或者需要完善的地方,请帮忙指出!Guide 哥感激不尽! 1. @SpringBootApplication 这里先单独拎出 @SpringBootApplication 注解说一下,虽然我们一般不会主动去使用它。 Guide 哥:这个注解是 Spring Boot 项目的基石,创建

接近8000字的Spring/SpringBoot常用注解总结!安排!

跟風遠走 提交于 2020-05-01 13:34:25
0.前言 大家好,我是 Guide 哥!这是我的 221 篇优质原创文章。如需转载,请在文首注明地址,蟹蟹! 本文已经收录进我的 75K Star 的 Java 开源项目 JavaGuide: https://github.com/Snailclimb/JavaGuide 相关阅读: V2.0 版本的 《JavaGuide面试突击版》来啦!带着它的在线阅读版本来啦! 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项目基本没啥大问题了! 整个目录如下,内容有点多: 为什么要写这篇文章? 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多,我看了文章内容之后属实觉得质量有点低,并且有点会误导没有太多实际使用经验的人(这些人又占据了大多数)。所以,自己索性花了大概 两天时间简单总结一下了。 因为我个人的能力和精力有限,如果有任何不对或者需要完善的地方,请帮忙指出!Guide 哥感激不尽! 1. @SpringBootApplication 这里先单独拎出 @SpringBootApplication 注解说一下,虽然我们一般不会主动去使用它。 Guide 哥:这个注解是 Spring Boot 项目的基石,创建

接近8000字的Spring/SpringBoot常用注解总结!安排!

扶醉桌前 提交于 2020-05-01 13:29:46
0.前言 大家好,我是 Guide 哥!这是我的 221 篇优质原创文章。如需转载,请在文首注明地址,蟹蟹! 本文已经收录进我的 75K Star 的 Java 开源项目 JavaGuide: https://github.com/Snailclimb/JavaGuide 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项目基本没啥大问题了! 整个目录如下,内容有点多: 为什么要写这篇文章? 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多,我看了文章内容之后属实觉得质量有点低,并且有点会误导没有太多实际使用经验的人(这些人又占据了大多数)。所以,自己索性花了大概 两天时间简单总结一下了。 因为我个人的能力和精力有限,如果有任何不对或者需要完善的地方,请帮忙指出!Guide 哥感激不尽! 1. @SpringBootApplication 这里先单独拎出 @SpringBootApplication 注解说一下,虽然我们一般不会主动去使用它。 Guide 哥:这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上。 @SpringBootApplication

硬核总结!接近8000字的Spring/SpringBoot常用注解总结!安排!

笑着哭i 提交于 2020-05-01 13:26:45
文章目录 0.前言 1. `@SpringBootApplication` 2. Spring Bean 相关 2.1. `@Autowired` 2.2. `Component`,`@Repository`,`@Service`, `@Controller` 2.3. `@RestController` 2.4. `@Scope` 2.5. `Configuration` 3. 处理常见的 HTTP 请求类型 3.1. GET 请求 3.2. POST 请求 3.3. PUT 请求 3.4. **DELETE 请求** 3.5. **PATCH 请求** 4. 前后端传值 4.1. `@PathVariable` 和 `@RequestParam` 4.2. `@RequestBody` 5. 读取配置信息 5.1. `@value`(常用) 5.2. `@ConfigurationProperties`(常用) 5.3. `PropertySource`(不常用) 6. 参数校验 6.1. 一些常用的字段验证的注解 6.2. 验证请求体(RequestBody) 6.3. 验证请求参数(Path Variables 和 Request Parameters) 7. 全局处理 Controller 层异常 8. JPA 相关 8.1. 创建表 8.2. 创建主键 8.3.