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 管理员用户凭证:
1、简介 本文将带你了解如何在 OpenAPI 文件中声明日期(Date)。特别是在使用 Swagger 实现的情况下,这将使我们能够在调用外部 API 时以标准化的方式管理输入和输出日期。
2、Swagger 和 OAS Swagger 是一组工具,实现了 OpenAPI Specification(OAS),它是一种与编程语言无关的接口,用于文档化 RESTful API。这使我们能够了解任何服务的功能,而无需访问源代码。
要实现这一点,需要在项目中创建一个文件,通常是 YAML 或 JSON,使用 OAS 描述 API。然后,使用 Swagger 工具:
通过浏览器(Swagger 编辑器)编辑规范 自动生成 API 客户库(Swagger Codegen) 显示自动生成的文档(Swagger UI) OpenAPI 文件示例 中包含了不同的部分的示例,本文重点关注模型定义。
3、定义日期(Date) 使用 OAS 定义一个 User 实体:
components: User: type: "object" properties: id: type: integer format: int64 createdAt: type: string format: date description: Creation date example: "2021-01-30" username: type: string 定义日期:
type 等于 string format 字段,指定格式为日期(Date) 在本例中,使用 format: date 来描述 createdAt。这使用 ISO 8601 格式的日期。
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 /> <!
1、概览 本文将带你了解 Spring 中 @Valid 和 @Validated 注解的用法和它们之间的区别。
在大多数应用中,验证用户输入是常见的功能。在 Java 生态系统中,一般使用 Java Standard Bean Validation API 来支持这一点,从 Spring 4.0 版本开始,它就与 Spring 完美集成。@Valid 和 @Validated 注解就源自于这个 Standard Bean API。
2、@Valid 和 @Validated 注解 在 Spring 中,通常使用 JSR-303 的 @Valid 注解进行方法级验证,以及用于标记成员属性以进行验证。不过,该注解不支持分组验证。
分组(Group)可以帮助限制在验证过程中应用的约束条件。一个特定的使用案例是 UI 引导(UI wizards)。在第一步中,可能会有一组特定的字段。在后续步骤中,可能还有同一个 Bean 的另一组字段。因此,需要在每个步骤中对这些有限的字段应用约束条件,但是 @Valid 无法支持这样的功能。
对于分组级(Group-Level)验证,必须使用 Spring 的 @Validated,它是 JSR-303 的 @Valid 的变体,用于方法级。对于成员属性的标记,继续使用 @Valid 注解就行。
3、示例 使用 Spring Boot 开发一个简单的用户注册表单。
首先,只有 name 和 password 属性:
public class UserAccount { @NotNull @Size(min = 4, max = 15) private String password; @NotBlank private String name; // 构造函数、Get、Set 省略 } 接下来是 Controller。在 saveBasicInfo 方法参数上使用 @Valid 注解来验证用户输入:
1、概览 本文将带你了解如何在 Spring MVC 中处理 POST 和 GET 请求中发送 JSON 参数。
2、Spring MVC 中的 JSON 参数 使用 JSON 发送或接收数据是 Web 开发人员的常见做法。JSON 字符串的分层结构为 HTTP 请求参数提供了一种更紧凑、更易于人类阅读的表示方式。
默认情况下,Spring MVC 通过了一系列内置的底层 Property Editor 为 String 等简单数据类型提供开箱即用的数据绑定。
但是,在实际项目中,可能需要绑定更复杂的数据类型。例如:将 JSON 参数映射到 Model Object。
3、使用 POST 请求发送 JSON Spring 提供了一种简单的方式来处理 POST 请求发送 JSON 数据。内置的 @RequestBody 注解可以自动将请求体中的 JSON 数据反序列化为特定的 Model 对象。
通常情况下,无需自己解析请求体,Spring MVC 会使用 Jackson 库来完成所有的工作。
首先,创建一个 Model 对象来表示传递的 JSON 数据。例如 Product 类:
public class Product { private int id; private String name; private double price; // 构造函数、get、set 方法省略 } 其次,定义一个接受 POST 请求的 Spring Handler 方法:
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,这就非常有用。
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
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:
1、简介 本文介绍了以字符串形式读取 HTTP 响应体的几种方式。
2、HttpClient Java 11 中添加了 HttpClient,用于访问 Web 资源。与 HttpURLConnection 不同的是,HttpClient 除了支持 HTTP/1.1 和 HTTP/2 外,它还提供同步和异步请求类型。
HttpClient 提供了一个现代化的 API,具有很大的灵活性和强大的功能。该 API 由三个核心类组成:HttpClient、HttpRequest 和 HttpResponse。
HttpResponse 描述了 HttpRequest 调用的结果。HttpResponse 并非直接创建,而是在完全接收到正文(Body)后才可用。
首先创建 HttpClient 和 HttpRequest 对象:
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(DUMMY_URL)) .build(); 然后,使用 BodyHandlers 并调用 ofString() 方法返回 String 响应:
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 3、HttpURLConnection HttpURLConnection 是一个轻量级 HTTP 客户端,用于通过 HTTP 或 HTTPS 协议访问资源,它允许创建一个 InputStream。获得 InputStream 后,就可以像读取普通本地文件一样读取它。
在 Java 中,可以用来访问互联网的主要类是 java.
1、概览 本文将会带你了解 Spring Cloud Netflix Feign 与 Spring Cloud OpenFeign 之间的区别。
2、Feign 通过 Feign 提供的注解支持,我们只需要定义接口就可以实现 Web 客户端,非常简单。
最初,Feign 由 Netflix 创建并发布,是其 Netflix OSS 项目的一部分。如今,它已成为一个开源项目。
2.1、Spring Cloud Netflix Feign Spring Cloud Netflix 将 Netflix OSS 产品集成到 Spring Cloud 生态系统(全家桶)中。其中包括 Feign、Eureka、Ribbon 以及大量其他工具和实用程序。Feign 被单独定义在一个 Spring Cloud Starter 中,以便只使用 Feign。
2.2、OpenFeign 后来,Netflix 决定停止在内部使用 Feign 并停止其开发。根据这一决定,Netflix 将 Feign 完全转移到开源社区的一个名为 OpenFeign 的新项目中。
幸运的是,它继续得到开源社区的大力支持,并推出了许多新功能和更新。
2.3、Spring Cloud OpenFeign 同样,Spring Cloud OpenFeign 将 OpenFeign 项目集成到 Spring Cloud 生态系统中。
这种集成增加了对 Spring MVC 注解的支持,并提供相同的 HttpMessageConverter。