文章插图
现在,Spring 将在调用方法之前拦截其请求并对参数进行验证 —— 无需使用额外的手工测试 。
另一种实现相同功能的方法是创建我们自己的注解 。虽然你通常只在需要超出 Hibernate的内置约束集 时才使用自定义注解,本例中,我们假设 @Length 不存在 。你可以创建两个额外的类来验证字符串长度,一个用于验证,一个用于对属性进行注解:

文章插图
请注意,这些情况下,关注点分离的最佳实践要求在属性为 null 时,将其标记为有效(isValid 方法中的 s == null),如果这是属性的附加要求,则使用 @NotNull 注解 。

文章插图
7. 错误七:(依旧)使用基于xml的配置
虽然之前版本的 Spring 需要 XML,但如今大部分配置均可通过 Java 代码或注解来完成;XML 配置只是作为附加的不必要的样板代码 。
本文(及其附带的 GitHub 仓库)均使用注解来配置 Spring,Spring 知道应该连接哪些 Bean,因为待扫描的顶级包目录已在 @SpringBootApplication 复合注解中做了声明,如下所示:

文章插图
复合注解(可通过 Spring 文档 了解更多信息)只是向 Spring 提示应该扫描哪些包来检索 Bean 。在我们的案例中,这意味着这个顶级包 (co.kukurin)将用于检索:
@Component (TopTalentConverter, MyAnnotationValidator)
@RestController (TopTalentController)
@Repository (TopTalentRepository)
@Service (TopTalentService) 类
如果我们有任何额外的 @Configuration 注解类,它们也会检查基于 Java 的配置 。
8. 错误八:忽略 profile
在服务端开发中,经常遇到的一个问题是区分不同的配置类型,通常是生产配置和开发配置 。在每次从测试切换到部署应用程序时,不要手动替换各种配置项,更有效的方法是使用 profile 。推荐阅读:Spring Boot Profile不同环境配置 。关注Java技术栈微信公众号,在后台回复关键字:boot,可以获取一份栈长整理的 Spring Boot 最新技术干货 。
考虑这么一种情况:你正在使用内存数据库进行本地开发,而在生产环境中使用 MySQL 数据库 。本质上,这意味着你需要使用不同的 URL 和 (希望如此) 不同的凭证来访问这两者 。让我们看看可以如何做到这两个不同的配置文件:
8.1. APPLICATION.YAML 文件

文章插图
假设你不希望在修改代码时意外地对生产数据库进行任何操作,因此将默认配置文件设为 dev 是很有意义的 。
然后,在服务器上,你可以通过提供 -Dspring.profiles.active=prod 参数给 JVM 来手动覆盖配置文件 。另外,还可将操作系统的环境变量设置为所需的默认 profile 。
9. 错误九:无法接受依赖项注入
正确使用 Spring 的依赖注入意味着允许其通过扫描所有必须的配置类来将所有对象连接在一起;这对于解耦关系非常有用,也使测试变得更为容易,而不是通过类之间的紧耦合来做这样的事情:

文章插图
我们让 Spring 为我们做连接:

文章插图
Misko Hevery 的 google talk 深入解释了依赖注入的 “为什么”,所以,让我们看看它在实践中是如何使用的 。在关注点分离(常见错误 #3)一节中,我们创建了一个服务和控制器类 。
假设我们想在 TopTalentService 行为正确的前提下测试控制器 。我们可以通过提供一个单独的配置类来插入一个模拟对象来代替实际的服务实现:

文章插图
然后,我们可以通过告诉 Spring 使用 SampleUnitTestConfig 作为它的配置类来注入模拟对象:

文章插图
之后,我们就可以使用上下文配置将 Bean 注入到单元测试中 。
10. 错误十:缺乏测试,或测试不当
尽管单元测试的概念已经存在很长时间了,但很多开发人员似乎要么 “忘记” 做这件事(特别是如果它不是 “必需” 的时候),要么只是在事后把它添加进来 。这显然是不可取的,因为测试不仅应该验证代码的正确性,还应该作为程序在不同场景下应如何表现的文档 。
推荐阅读
- 图文演示Ubuntu系统安装过程
- 喝茶的三大基本功
- 超详细的AIX系统命令总结
- 福鼎白茶的茶香 茶韵 茶效
- js的基本数据类型和引用数据类型
- 古集宝典里描述的茶叶九大养生功效
- 藏茶的包容性及功效特点
- 系统管理员入门:排除故障
- 梦到父亲的坟墓 梦见父亲的坟墓是什么预兆
- 将ETL工具整合到您的数据仓库策略中
