1、概览 Spring Boot 通过 Hibernate Validator(Bean Validation 的实现)对数据验证提供了强大的支持。
本文将通过一个实际的 REST 应用带你了解如何在 Spring Boot 中校验数据。
2、Maven 依赖 在 pomx.ml 中添加 spring-boot-starter-web、spring-boot-starter-jpa 和 H2 database 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> <scope>runtime</scope> </dependency> 从 Boot 2.3 开始,还需要明确添加 spring-boot-starter-validation 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 3、示例 Domain 类 定义一个 JPA 实体类,User:
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @NotBlank(message = "Name is mandatory") private String name; @NotBlank(message = "Email is mandatory") private String email; // 构造函数、Set、Set 方发省略 } User 实体类很简单,它展示了如何使用 Bean Validation 的约束来限制 name 和 email 字段。
1、概览 本文将带你了解如何在 Spring Boot 中使用 H2 内存数据库。与其他数据库一样,Spring Boot 生态系统对 H2 提供了开箱即用的支持。
2、依赖 添加 h2 和 spring-boot-starter-data-jpa 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> 3、Datasource 配置 默认情况下,Spring Boot 会配置应用使用用户名 sa 和空密码连接到内存数据库。
不过,你也可以通过在 application.properties 文件中添加以下属性来更改这些参数:
spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=password spring.jpa.database-platform=org.hibernate.dialect.H2Dialect 相应的 YAML 配置如下:
spring: datasource: url: jdbc:h2:mem:mydb username: sa password: password driverClassName: org.h2.Driver jpa: spring.jpa.database-platform: org.hibernate.dialect.H2Dialect 内存数据库会在应用重启后会丢失数据,可以通过使用基于文件的存储来改变这种行为。
更新 spring.datasource.url 属性:
spring.datasource.url=jdbc:h2:file:/data/demo 相应的 YAML 配置如下:
spring: datasource: url: jdbc:h2:file:/data/demo H2 数据库还可以在 其他模式 下运行。
1、概览 Spring Boot 的自动配置功能让配置 Spring 变得更容易。
本文将带你了解 org.springframework.boot.autoconfigure 和 org.springframework.boot.autoconfigure.condition 包中的核心注解。
2、@SpringBootApplication 使用此注解来标记 Spring Boot 应用的 main 类:
@SpringBootApplication class VehicleFactoryApplication { public static void main(String[] args) { SpringApplication.run(VehicleFactoryApplication.class, args); } } @SpringBootApplication 封装了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注解,均为默认属性。
3、@EnableAutoConfiguration @EnableAutoConfiguration 顾名思义就是启用自动配置。这意味着 Spring Boot 会在其 classpath 上查找自动配置 Bean,并自动应用它们。
注意,必须将此注解与 @Configuration 一起使用:
@Configuration @EnableAutoConfiguration class VehicleFactoryConfig {} 4、自动配置的条件注解 通常,在编写自定义自动配置时,我们希望 Spring 有条件地使用它们。这可以通过本节中的注解来实现这一目标。
可以将本节中的注解放在 @Configuration 类或 @Bean 方法上。
4.1、@ConditionalOnClass 和 @ConditionalOnMissingClass 只有注解参数中的类存在/不存在时,Spring 才会使用标记的自动配置 Bean:
1、概览 本文将带你了解如何使用 Spring Security OAuth 和 Spring Boot 以及 Keycloak 作为授权服务器来实现单点登录(SSO)。
我们会使用 4 个不同的应用:
授权服务器 - 中央认证机制 资源服务器 - Foo 资源的提供者 两个客户端应用 - 使用 SSO 的应用 简单地说,当用户试图通过一个客户端应用访问资源时,他们会被重定到授权服务器进行身份认证。Keycloak 会对用户进行登录,在登录第一个应用后,如果使用同一浏览器访问第二个客户端应用,用户无需再次输入凭据。
使用 OAuth2 的授权码(Authorization Code)模式。
Spring Security 将此功能称为 OAuth 2.0 登录,而 Spring Security OAuth 将其称为 SSO。
2、授权服务器 以前,通过 Spring Security OAuth 可以将授权服务器设置为 Spring 应用。
不过,Spring Security OAuth 已被 Spring 弃用,现在可以使用 Keycloak 作为授权服务器。
因此,这次我们在 Spring Boot 应用中把授权服务器设置为嵌入式 Keycloak 服务器。
在 预配置 中,我们将定义两个客户端,即 ssoClient-1 和 ssoClient-2,分别对应每个客户端应用。
1、概览 本文将带你了解如何在 YAML 中定义列表,以及如何在 Spring Boot 中把 YAML 列表映射为 Java List 对象。
2、回顾一下 YAML 中的列表 简而言之,YAML 是一种人类可读的数据序列化标准,为编写配置文件提供了一种简洁明了的方法。YAML 的优点在于它支持多种数据类型,如 List、Map 和标量(Scalar)类型。
YAML 列表中的元素使用 - 字符定义,它们的缩进级别相同:
yamlconfig: list: - item1 - item2 - item3 - item4 相比之下,在 properties 中定义列表则使用的是索引值:
yamlconfig.list[0]=item1 yamlconfig.list[1]=item2 yamlconfig.list[2]=item3 yamlconfig.list[3]=item4 与 properties 文件相比,YAML 的分层性质大大提高了可读性。YAML 的另一个功能是可以为不同的 Spring Profile 定义不同的属性。从 Boot 2.4.0 版开始,properties 文件也可以这样做。
Spring Boot 为 YAML 配置提供了开箱即用的支持。根据设计,Spring Boot 会在启动时从 application.yml 中加载配置属性,无需任何额外工作。
3、将 YAML 列表绑定至简单的 List Spring Boot 提供了 @ConfigurationProperties 注解,以简化将外部配置数据映射到对象模型的逻辑。
本文将带你了解如何在 Spring Boot 应用中使用 WebSocket 构建一个在线的日志系统。通过该系统,不需要登录服务器,即可在 HTML 页面上通过 WebSocket 长连接预览到服务器的即时日志。
创建 Spring Boot 应用 添加 spring-boot-starter-websocket 依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> WebSocket 配置 创建 WebSocketConfiguration 配置类,配置 ServerEndpointExporter Bean,用于扫描系统中的 WebSocket 端点实现。
package cn.springdoc.demo.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfiguration { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } 创建日志端点 创建 LoggingChannel WebSocket 端点实现类,接受客户端连接,并且推送日志消息。
package cn.springdoc.demo.web.channel; import java.
1、概览 随着越来越多的企业转向使用容器,Docker 在软件开发中的地位也越来越重要。为此,Spring Boot 2.3 的一大新功能就是为 Spring Boot 应用轻松创建 Docker 镜像提供了支持。
本文将带你了解如何为 Spring Boot 应用创建 Docker 镜像。
2、传统的 Docker 构建 使用 Spring Boot 构建 Docker 镜像的传统方法是使用 Dockerfile。
下面是一个简单的 Dockerfile 示例:
FROM openjdk:8-jdk-alpine EXPOSE 8080 ARG JAR_FILE=target/demo-app-1.0.0.jar ADD ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] 然后,使用 docker build 命令创建 Docker 镜像。这对大多数应用都很有效,但也有一些缺点。
首先,我们使用的是 Spring Boot 创建的 Fat jar。这会影响启动时间,尤其是在容器化环境中。我们可以通过添加 Jar 文件的解压内容来节省启动时间。
其次,Docker 镜像是分层构建的。Spring Boot Fat Jar 的性质导致所有应用代码和第三方库都被放在一个层中。这意味着,即使只有一行代码发生变化,也必须重建整个层。
通过在构建之前解压 Jar 文件,应用代码和第三方库分别有自己的层。这使我们能够利用 Docker 的缓存机制,当更改一行代码时,只需要重新构建相应的层。
有了这个理念,让我们看看 Spring Boot 如何改进创建 Docker 镜像的过程。
1、概览 在 Spring 3.0 之前,XML 是定义和配置 Bean 的唯一方法。Spring 3.0 引入了 JavaConfig,允许我们使用 Java 类配置 Bean。不过,如今有些项目仍然在使用 XML 配置文件。
本文将带你了解如何在 Spring Boot 应用中整合 XML 配置。
2、@ImportResource 注解 @ImportResource 注解可以导入一个或多个包含 Bean 定义的资源。
比方说,我们有一个包含 Bean 定义的 beans.xml 文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean class="com.baeldung.springbootxml.Pojo"> <property name="field" value="sample-value"></property> </bean> </beans> 要在 Spring Boot 应用中使用它,可以使用 @ImportResource 注解,告诉它在哪里可以找到配置文件:
@Configuration @ImportResource("classpath:beans.xml") public class SpringBootXmlApplication implements CommandLineRunner { @Autowired private Pojo pojo; public static void main(String[] args) { SpringApplication.
1、概览 Flyway 迁移并不总是一帆风顺行,本文将带你了解迁移失败后的恢复方案。
2、设置 从基本的 Spring Boot 配置 Flyway 开始。它依赖 flyway-core、spring-boot-starter-jdbc 和 flyway-maven-plugin。
对于如何在 Spring Boot 中使用 Flyway 进行数据库迁移,你可以参阅 这篇文章。
2.1、配置 首先,添加两个不同的 Profile(配置文件)。这能够轻松地针对不同的数据库引擎运行迁移:
<profile> <id>h2</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> </dependencies> </profile> <profile> <id>postgre</id> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency> </dependencies> </profile> 还要为每个 Profile 添加 Flyway 数据库配置文件。
首先,创建 application-h2.properties:
flyway.url=jdbc:h2:file:./testdb;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;MODE=MySQL;DATABASE_TO_UPPER=false; flyway.user=testuser flyway.password=password 然后,创建 PostgreSQL application-postgre.properties:
flyway.url=jdbc:postgresql://127.0.0.1:5431/testdb flyway.user=testuser flyway.password=password 注:你可以调整 PostgreSQL 配置,使其与你的数据库相匹配,也可以使用 代码示例中的 docker-compose 文件。
2.2、迁移 添加第一个迁移(migration)文件 V1_0__add_table.sql:
create table table_one ( id numeric primary key ); 添加第二个包含错误的迁移文件 V1_1__add_table.
1、概览 Spring Boot 提供了几种不同的方法来检查运行中的应用及其组件的状态和健康状况。在这些方法中,HealthContributor 和 HealthIndicator API 是值得注意的两种。
本文将带你了解这些 API 的原理以及如何向它们提供自定义信息。
2、依赖 Health Information Contributor(健康信息贡献者)是 Spring Boot Actuator 模块的一部分:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 3、内置的 HealthIndicator Spring Boot 注册了许多开箱即用的 HealthIndicator 来报告应用特定方面的健康状况。
其中一些指标默认已经注册了,如 DiskSpaceHealthIndicator 或 PingHealthIndicator。前者报告磁盘的当前状态,后者则作为应用的 ping 端点。
Spring Boot 也会有条件地注册一些指标。也就是说,如果 classpath 上存在某些依赖或满足某些其他条件,Spring Boot 可能也会注册一些其他的 HealthIndicator。例如,如果使用了关系型数据库,那么 Spring Boot 就会注册 DataSourceHealthIndicator。同样,如果使用的是 Cassandra 作为数据存储,它会注册 CassandraHealthIndicator。
可以调用 /actuator/health 端点来检查 Spring Boot 应用的健康状态。该端点会报告所有已注册的 HealthIndicator 的汇总结果。
如果要查看某个特定指标的健康报告,可以调用 /actuator/health/{name} 端点。例如,调用 /actuator/health/diskSpace 端点将返回 DiskSpaceHealthIndicator 的状态报告:
{ "status": "UP", "details": { "total": 499963170816, "free": 134414831616, "threshold": 10485760, "exists": true } } 4、自定义 HealthIndicator 除了内置的 HealthIndicator,还可以注册自定义 HealthIndicator 来报告组件或子系统的健康状况。只需将 HealthIndicator 接口的实现注册为 Spring Bean 即可。