Spring-Boot

在 Spring Boot 中嵌入 Keycloak 服务器

1、概览 Keycloak 是由 Red Hat 管理和在 Java 中由 JBoss 开发的开源身份和访问管理解决方案。 本文将带你了解如何在 在 Spring Boot 中嵌入 Keycloak 服务器,这样就能轻松启动预配置的 Keycloak 服务器。 Keycloak 也可以作为 独立服务器 运行,但需要下载并通过管理控制台进行设置。 2、Keycloak 预配置 服务器包含一组 Realm,每个 Realm 都是用户管理的独立单元。要对其进行预配置,我们需要指定一个 JSON 格式的 Realm 定义文件。 使用 Keycloak Admin 控制台 配置的所有内容都以 JSON 格式进行持久化。 我们的授权服务器将使用名为 baeldung-realm.json 的 JSON 文件进行预配置。文件中的几个相关配置如下: users:默认用户是 john@test.com 和 mike@other.com;对应的凭证也在这里。 clients:定义一个 ID 为 newClient 的客户端 standardFlowEnabled:设置为 true,激活 newClient 的授权码(Authorization Code)授权模式。 redirectUris:newClient 在成功验证后将重定向到的服务器 URL webOrigins:置为 +,为所有 redirectUris 的 URL 提供 CORS 支持 Keycloak 服务器会默认签发 JWT Token,因此无需为此进行单独配置。接下来看看 Maven 的配置。

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器,以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么? Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单点登录(SSO)、身份代理和社交登录、用户联盟、客户端适配器、管理控制台和账户管理等功能。 本文使用 Keycloak 的管理控制台,使用 Spring Security OAuth2.0 设置和连接 Spring Boot。 3、设置 Keycloak 服务器 设置和配置 Keycloak 服务器。 3.1、下载和安装 Keycloak 有多种发行版可供选择,本文使 Keycloak-22.0.3 独立服务器发行版。点击 这里 从官方下载。 下载完后,解压缩并从终端启动 Keycloak: unzip keycloak-22.0.3.zip cd keycloak-22.0.3 bin/kc.sh start-dev 运行这些命令后,Keycloak 会启动服务。如果你看到一行类似于 Keycloak 22.0.3 [...] started 的内容,就表示服务器启动成功。 打开浏览器,访问 http://localhost:8080,会被重定向到 http://localhost:8080/auth 以创建管理员进行登录: 创建一个名为 initial1 的初始管理员用户,密码为 zaq1!QAZ。点击 “Create”后,可以看到 “User Created” 的提示信息。 现在进入管理控制台。在登录页面,输入 initial 管理员用户凭证:

Spring Boot 整合 QueryDSL 及常见用法

QueryDSL 是一个用于构建类型安全查询的开源 Java ORM 框架。它提供了一种 Fluent 风格的 API 来构建和执行数据库查询,并提供了编译时类型检查,以避免常见的查询错误。QueryDSL 支持多种数据库,包括关系型数据库和 NoSQL 数据库,可以与多个持久化框架(如 JPA、Hibernate 等)整合使用。它简化了查询的编写过程,使得查询代码更易于理解、维护和重用。 QueryDSL 在 Spring Boot 中通常配合 Spring Data JPA 使用,它会根据定义的 JPA Entity 类自动生成对应的查询类。通过查询类,除了可以快速地进行基本的 CRUD 操作外还支持 JOIN、GROUP、子查询等复杂的检索。而这一切都无需编写任何 SQL 语句,代码即 SQL。 本文将会带你了解如何在 Spring Boot 中整合 QueryDSL + Spring Data JPA,以及 QueryDSL 的常见用法。 示例项目 本文使用到的软件版本: Java:21 Spring Boot:3.2.0 MySQL:8.0.26 添加依赖 创建 Spring Boot 应用,完整的 pom.xml 如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath /> <!

Spring Boot 创建非 Web 应用

1、简介 Spring Boot 是一个出色、流行的框架,可以快速创建适用于各种用例的 Java 应用。其中最常见用法之一是使用嵌入式 Servlet 容器来作为 Web 服务器。 Spring Boot 也可以用于许多不需要 Web 服务器的应用,如:命令行应用、作业调度、批处理或流处理应用等。 本文将带你了解在没有 Web 服务器的情况下使用 Spring Boot 的几种不同方式。 2、依赖 防止 Spring Boot 应用启动嵌入式 Web 服务器的最简单方法就是不在依赖中包含 Web Server Starter。 这意味着在 Maven POM 或 Gradle build 文件中都不会包含 spring-boot-starter-web 依赖。相反,使用更基本的 spring-boot-starter 依赖来替代它。 注意,Tomcat 依赖有可能作为传递依赖包含在应用中。在这种情况下,可能需要将 Tomcat 从包含它的依赖中排除。 3、修改 Spring Application 另一种禁用 Spring Boot 内嵌 Web 服务器的方法是使用代码。 使用 SpringApplicationBuilder: new SpringApplicationBuilder(MainApplication.class) .web(WebApplicationType.NONE) .run(args); 或者,可以使用 SpringApplication: SpringApplication application = new SpringApplication(MainApplication.class); application.setWebApplicationType(WebApplicationType.NONE); application.run(args); 无论哪种方式,都可以在 classpath 上保留可用的 Servlet 和容器 API。这意味着仍然可以在不启动 Web 服务器的情况下使用 Web 服务器库。例如,使用它们来编写测试或在自己的代码中使用它们的 API,这就非常有用。

Spring Boot 中的 CharacterEncodingFilter

1、概览 本文将会带你了解 Spring Boot 中 CharacterEncodingFilter 的作用及其用法。 2、CharacterEncodingFilter CharacterEncodingFilter 是一个 Servlet Filter,可帮助我们为请求(Request)和响应(Response)指定字符编码。当浏览器未设置字符编码或我们希望对请求和响应进行特定处理时,该过滤器就非常有用。 3、实现 来看看如何在 Spring Boot 应用中配置该过 Filter。 首先,创建 CharacterEncodingFilter: CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); 在本例中,将编码设置为了 UTF-8,你也可以根据需要设置其他编码。 这里还使用了 forceEncoding 属性,无论浏览器请求中是否存在编码,都强制执行指定的编码。由于该标志设置为 true,提供的编码也将应用于响应的编码。 最后,使用 FilterRegistrationBean 注册 Filter,它提供了配置来将 Filter 实例注册为过滤器链(Filter Chain)的一部分: FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(filter); registrationBean.addUrlPatterns("/*"); return registrationBean; 在非 Spring Boot 的应用中,可以在 web.xml 文件中添加该 Filter,以获得相同的效果。 4、总结 本文介绍了 Spring 中 CharacterEncodingFilter 的作用以及配置方法。 Ref:https://www.baeldung.com/spring-boot-characterencodingfilter

在 Spring Boot 运行时获取监听的端口号

1、概览 Spring Boot 应用嵌入了一个 Web 服务器,有时候我们可能希望在运行时获取 HTTP 端口。 本文将带你了解如何在 Spring Boot 应用中以编程式的方式获取 HTTP 端口。 2、示例 2.1、Spring Boot 应用 创建一个简单的 Spring Boot 应用示例,演示如何在运行时获取 HTTP 端口: @SpringBootApplication public class GetServerPortApplication { public static void main(String[] args) { SpringApplication.run(GetServerPortApplication.class, args); } } 2.2、设置端口号的两种方式 通常,配置 Spring Boot 应用 HTTP 端口的最直接方法是在配置文件 application.properties 或 application.yml 中定义端口。 例如,在 application.properties 文件中,可以将 7777 设置为应用的运行端口: server.port=7777 另外,也可以不定义固定端口,而是通过将 server.port 属性值设置为 0,让 Spring Boot 应用在随机端口上运行: server.port=0 3、运行时获取固定端口 创建一个 properties 文件 application-fixedport.properties,并在其中定义固定端口 7777:

Spring Boot 中 @ComponentScan 与 @EnableAutoConfiguration 的区别

1、简介 本文将带你了解 Spring Boot 中 @ComponentScan 和 @EnableAutoConfiguration 注解的作用以及它们之间的区别。 2、Spring 注解 注解使 Spring 中依赖注入的配置变得更容易。可以在类和方法上使用 Spring Bean 注解来定义 Bean,而不是使用 XML 配置文件。之后,Spring IoC 容器会配置和管理 Bean。 本文主要关注如下注解: @ComponentScan:用于扫描带有注解的 Spring 组件。 @EnableAutoConfiguration:用于启用自动配置。 3、它们的区别 这俩注解的主要区别在于 @ComponentScan 会扫描 Spring 组件,而 @EnableAutoConfiguration 则用于自动配置 Spring Boot 应用中存在于 classpath 中的 Bean。 3.1、@ComponentScan 在开发应用时,需要告诉 Spring 框架如何查找受 Spring 管理的组件。@ComponentScan 使 Spring 能够扫描配置、Controller、Service 和我们定义的其他组件。 其中,@ComponentScan 注解与 @Configuration 注解一起使用,用于指定 Spring 扫描组件的包: @Configuration @ComponentScan public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.

Swagger UI 设置 JWT

1、简介 本文将带你了解如何在 Spring Boot 中配置 Swagger UI,使其在调用 API 时包含 JWT(JSON Web Token)。 2、Maven 依赖 本例使用 springdoc-openapi-ui 库,它包含了使用 Swagger 和 Swagger UI 所需的所有依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.7.0</version> </dependency> 3、Swagger 配置 首先,需要配置 JWT SecurityScheme: private SecurityScheme createAPIKeyScheme() { return new SecurityScheme().type(SecurityScheme.Type.HTTP) .bearerFormat("JWT") .scheme("bearer"); } 然后,配置 OpenAPI Bean,包含 API Info 和 Security Scheme: @Bean public OpenAPI openAPI() { return new OpenAPI().addSecurityItem(new SecurityRequirement(). addList("Bearer Authentication")) .components(new Components().addSecuritySchemes ("Bearer Authentication", createAPIKeyScheme())) .

Spring Boot 中的 DispatcherServlet 和 web.xml

1、概览 DispatcherServlet 是 Spring Web 应用的前端控制器(Front Controller)。它用于在 Spring MVC 中创建 Web 应用和 REST 服务。在传统的 Spring Web 应用中,该 Servlet 是在 web.xml 文件中定义的。 本文将会带你了解如何在 Spring Boot 项目中配置 DispatcherServlet,以及如何配置 web.xml 中的 Filter、Servlet 和 Listener。 2、Maven 依赖 首先,在 pom.xml 文件中添加 spring-boot-starter-web Maven 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 3、DispatcherServlet DispatcherServlet 接收所有 HTTP 请求,并将其调度给 Controller 类。 在 Servlet 3.x 规范发布之前,DispatcherServlet 会在 Spring MVC 应用的 web.xml 文件中注册。自 Servlet 3.x 规范发布后,可以使用 ServletContainerInitializer 以编程方式注册 Servlet。 web.xml 文件中的 DispatcherServlet 配置示例:

start.spring.io 创建旧版本的 Spring Boot 项目

Spring Initializr(start.spring.io)是由 Spring Boot 官方提供的一个开源的 Spring Boot 项目初始化器。它提供了一个简单易用的界面来创建和配置 Spring 项目的初始代码。通过这个网站,开发者可以选择所需的 Spring Boot 版本、语言、构建工具(如 Maven 或 Gradle)、依赖和其他项目设置。 由于 Spring Boot 飞速发展,紧跟官方更新的 Spring Initializr 中可选择的 Spring Boot 版本、Java 版本也在随之迭代升级。所以,通过 Spring Initializr 可能无法选择旧版本的 Spring Boot。 截止撰稿时,start.spring.io 中最低的 Spring Boot 版本为 3.1.6,而目前大多数人用的仍然是 Spring Boot 2。 本文将会带你了解如何通过 start.spring.io 创建旧版本的 Spring Boot 项目。 手动修改版本号 你可以直接从 start.spring.io 创建任意 Spring Boot 和 Java 版本的 Spring Boot 项目,然后手动修改 pom.xml 或者 build.gradle 中的版本配置即可: 以 Maven 项目为例,只需要修改 pom.xml 中的 2 个配置元素即可: