Spring-Boot

在 Spring Boot 中使用 ProblemDetail 返回错误

1、简介 本文将带你了解如何在 Spring Boot 应用中使用 ProblemDetail 响应错误信息,无论我们处理的是 REST API 还是 Reactive Stream(响应式流),它都提供了一种向客户端传达错误的标准化方式。 2、为什么要关注 ProblemDetail? 使用 ProblemDetail 来标准化错误响应对任何 API 都至关重要。 它可以帮助客户理解和处理错误,提高 API 的可用性和可调试性。这将带来更好的开发体验和更强大的应用。 采用它还有助于提供更翔实的错误信息,这对维护我们的服务和排除故障至关重要。 3、传统的错误处理方式 在 ProblemDetail 之前,我们经常在 Spring Boot 中实现自定义 ExceptionHandler 和 ResponseEntity 来处理错误。我们会创建自定义的错误响应结构。这导致了不同 API 之间的不一致性。 这种方式不仅需要大量的模板代码。而且,缺乏表示错误的标准化方式,因此客户端很难统一解析和理解错误信息。 4、ProblemDetail 规范 ProblemDetail 规范是 RFC 7807 标准的一部分。它为错误响应定义了一致的结构,包括诸如类型(type)、标题(title)、状态(status)、详情(detail)和实例(instance)等字段。这种标准化提供了一个通用的错误信息格式,有助于 API 开发人员和使用者。 实现 ProblemDetail 可确保我们的错误响应具有可预测性并易于理解。这反过来提高了我们的 API 和其客户端之间的整体沟通效果。 5、在 Spring Boot 中实现 ProblemDetail 在 Spring Boot 中有多种方法可以实现 ProblemDetail。 5.1、通过配置属性启用 ProblemDetail 我们可以添加一个配置属性来启用它。对于 RESTful 服务,在 application.properties 中添加以下属性: spring.mvc.problemdetails.enabled=true 此属性可使 ProblemDetail 自动用于基于 MVC(servlet 栈)的应用中的错误处理。

Spring Boot @MockBean 指南

1、概览 本文将带你了解 Spring Boot @MockBeans 注解的用法。 2、示例项目 以一个简单的票据验证器(Ticket Validator)示例为例: public class TicketValidator { private CustomerRepository customerRepository; private TicketRepository ticketRepository; public boolean validate(Long customerId, String code) { customerRepository.findById(customerId) .orElseThrow(() -> new RuntimeException("Customer not found")); ticketRepository.findByCode(code) .orElseThrow(() -> new RuntimeException("Ticket with given code not found")); return true; } } 如上,我们定义了 validate() 方法,用于检查数据库中是否存在给定数据。它依赖 CustomerRepository 和 TicketRepository。 现在,来看看如何使用 Spring 的 @MockBean 和 @MockBeans 注解创建测试和模拟依赖。 3、@MockBean 注解 Spring 框架提供了 @MockBean 注解,用于模拟依赖以进行测试。该注解允许我们定义特定 Bean 的模拟版本。新创建的模拟 Bean 将被添加到 Spring ApplicationContext 中。因此,如果已经存在相同类型的 Bean,它将被替换为模拟版本。

Spring Boot 配置和绑定二进制数据

Spring Boot 中的 application.yaml / application.properties 配置文件用于定义应用运行时需要的配置属性。 Spring Boot 提供了强大的配置属性绑定功能,可以把配置文件中的属性绑定到 Java Bean,并且会根据 Java Bean 的字段类型对配置属性进行必要的转换。 绑定属性到 Bean 通过一个简单的示例来看看如何把配置文件中的配置属性绑定到 Bean,并且自动转换其类型。 本文使用的 Spring Boot 版本是 3.3.1。 创建 Spring Boot 项目 创建任意 Spring Boot 应用。 定义配置属性 在 src/main/resources 目录下创建 application.yaml 配置文件,并在其中定义如下自定义的配置属性: app: # 数值 port: 8080 # 字符串 title: "Spring Boot 属性绑定测试" # Duration duration: 15s # DataSize data-size: 10MB # 集合 file-types: ["png", "jpeg"] 如上,在配置文件中定义了几个不同类型的配置属性。在本例中,这些配置属性的名称没有任何意义,随意取的。 定义配置 Bean 在 cn.springdoc.demo.prop 包下定义与配置文件中属性相对应的 Bean。 package cn.

处理 Spring Boot H2 Exception:“Schema not found”

1、概览 H2 是一个开源的 SQL 数据库,在 Java 中通常用于测试。它是一个内存数据库,不会将任何数据持久化到磁盘,因此速度非常快。 在与 Spring Boot 整合时,我们可能会遇到 “Schema not found” 异常,本文将带你了解出现此异常的原因,以及如何解决该异常。 2、理解异常的原因 H2 的默认 Schema 是 PUBLIC。如果我们映射的 JPA 实体类不使用 PUBLIC Schema,则必须确保在 H2 上创建了 Schema。当目标 Schema 不存在时,Spring Boot 会抛出异常 “Schema not found”。 模拟一下这个场景。在 Spring Boot 应用中创建以下实体类和 Repository。 @Entity @Table(name = "student", schema = "test") public class Student { @Id @Column(name = "student_id", length = 10) private String studentId; @Column(name = "name", length = 100) private String name; // 构造函数、Getter\Setter 方法 } 如上 @Table 注解指定了实体映射到 test Schema 下的 student 表的映射细节。

Spring Boot v3.3.2 发布

Spring Boot v3.3.2 正式发布。 🐞 Bug 修复 没有在 Spring Integration 6.2 中引入的 defaultTimeout 设置的配置属性 #41521 在 OnClassCondition.resolveOutcomesThreaded 中进行自动配置时出现 NPE,因为 firstHalf 为 null #41504 Spring 授权服务器现在将 multipleIssuersAllowed 默认为 false,并且不容易重新启用 #41355 ServiceConnection 无法与 @DataLdapTest 一起使用 #41325 PropertiesMigrationListener 错误地将属性报告为过时属性 #41252 @NestedConfigurationProperty 对 Record 不起作用 #41251 TestcontainersLifecycleBeanPostProcessor 无法与 Scope Bean 正常工作 #41238 如果 spring.config.import 无法解析,错误信息可能具有误导性 #41236 Docker desktop 更新后,构建镜像失败,提示 “Illegal char <:> at index 5: npipe:////” #41234 使用 Jetty 时,Filter、Listener 和 Servlet 未使用同一线程上下文 classloader 初始化 #41225 在 Webflux 中使用 DirtiesContext、随机端口和多个上下文的情况下,可能会导致多个上下文的行为异常 #41221 在原生镜像中使用 spring-boot-starter-activemq 时,org.

使用 Podman Desktop 容器化 Spring Boot 应用

1、概览 本文将带你了解如何使用 Podman Desktop 对 Spring Boot 应用进行容器化。Podman 是一种容器化工具,它允许我们在不需要守护进程的情况下管理容器。 Podman Desktop 是一款具有图形用户界面(GUI)的桌面应用,用于使用 Podman 管理容器。 为了演示其用法,我们要创建一个简单的 Spring Boot 应用,构建容器镜像,并使用 Podman Desktop 运行容器。 2、安装 Podman Desktop 我们需要在本地计算机上 安装 Podman Desktop 才能开始使用。它适用于 Windows、macOS 和 Linux 操作系统。下载安装程序后,按照安装说明在机器上安装 Podman Desktop 即可。 以下是设置 Podman Desktop 的几个重要步骤: 机器上应已安装 Podman。如果没有安装,Podman Desktop 会提示并为我们安装。 Podman 准备就绪后,系统会提示我们启动 Podman 虚拟机。我们可以选择默认设置,也可以根据需要自定义设置。在运行容器之前,这是必须的。 此外,对于 Windows,需要启用/安装 WSL2(Windows Subsystem for Linux),然后才能运行 Podman。 在安装过程结束时,我们应该有一个正在运行的 Podman 虚拟机,并可以使用 Podman Desktop 进行管理。 可以在 “Dashboard”(仪表盘)部分看到: 3、创建 Spring Boot 应用 创建一个小型 Spring Boot 应用。该应用有一个 REST Controller,当我们访问 /hello 端点时,它返回一条 "Hello, World!

Spring Boot 测试 CORS 跨域配置

1、简介 跨源资源共享(Cross-Origin Resource Sharing,CORS)是一种安全机制,允许网页从一个源访问另一个源的资源。它由浏览器强制执行,以防止网站向不同域发出未经授权的请求。 在使用 Spring Boot 构建 Web 应用时,必须正确测试 CORS 配置,以确保应用能安全地与授权的源交互,同时阻止未经授权的源。 通常情况下,我们只有在应用部署后才会发现 CORS 问题。通过尽早测试 CORS 配置,可以在开发过程中发现并解决这些问题,从而节省时间和精力。 本文将带你了解讨如何使用 MockMvc 编写有效的测试来验证 CORS 配置。 关于 Spring Boot 中 CORS 跨域配置的详细内容,你可以参阅 “在 Spring 应用中处理 CORS 跨域” 和 “Spring 和 CORS 跨域” 这两篇文章。 2、Spring Boot 配置 CORS 在 Spring Boot 应用中配置 CORS 有多种方法。在本文中,我们使用 Spring Security 并自定义 CorsConfigurationSource: private CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowedOrigins(List.of("https://baeldung.com")); corsConfiguration.setAllowedMethods(List.of("GET")); corsConfiguration.setAllowedHeaders(List.of("X-Baeldung-Key")); corsConfiguration.setExposedHeaders(List.of("X-Rate-Limit-Remaining")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.

Spring Boot v3.3.1 发布

Spring Boot v3.3.1 发布了,这是 Spring Boot v3.3 的第一个 BUG 修复版本。 🐞 Bug 修复 添加 org.springframework.boot.jdbc.parameters 标签后,SQL Server JDBC URL 出现格式错误 #41169 git-commit-id Maven 插件升级后,无法强制转换 Git instant 属性 #41152 将 status code 排除在 DefaultErrorAttributes 之外会引发 NPE(控指针异常)#41141 使用 devtools 进行 Spring Boot 远程重启时,在使用 java -jar 运行时会导致 Tomcat 错误 “factory already defined” #41107 MongoHealthIndicator 在严格设置下不符合 Mongo 稳定(Stable) API #41104 Bitnami MongoDB 服务连接失败 #41097 构建镜像时需要 Builder 指定一个栈(Stack)#41091 如果未包含 java.sql 模块,DataSourceProperties 绑定失败 #41084 使用 include 时,AOT 导致 Logback 配置错误 #41081 配置了 Builder 和 Buildpack 时,镜像构建挂起 #41049 尝试使用 Spring Boot 配置的 SSL 时,使用 Tomcat 的 HttpNio2Protocol 会抛出 IllegalArgumentException #41010 当包含 Multi-Release: true 的依赖项且 META-INF/versions 中存在意外文件条目时,Uber jar 启动失败 #41006 使用 Jetty 时,可执行 war 文件中可能找不到 JSP 相关资源 #40996 无论配置的最大线程数是多少,tomcat.

在 Spring Boot GraalVM 原生镜像中使用 Thymeleaf 布局和 Fragment 表达式

在 Spring Boot + Thyemleaf 的应用中,我们可以使用 thymeleaf-layout-dialect 来定义网页的通用布局,效果很好。 但是当我们将 Spring Boot 应用编译到 GraalVM 原生镜像时,却 出现了问题。 GraalVM Native Image: Generating 'demo' (executable)... ======================================================================================================================== [1/7] Initializing... (5,6s @ 0,32GB) Version info: 'GraalVM 22.3.1 Java 17 CE' Java version info: '17.0.6+10-jvmci-22.3-b13' C compiler: gcc (linux, x86_64, 11.3.0) Garbage collector: Serial GC 2 user-specific feature(s) - com.oracle.svm.polyglot.groovy.GroovyIndyInterfaceFeature - org.springframework.aot.nativex.feature.PreComputeFieldFeature Field org.apache.commons.logging.LogAdapter#log4jSpiPresent set to true at build time Field org.apache.commons.logging.LogAdapter#log4jSlf4jProviderPresent set to true at build time Field org.

Spring Boot 3.3 中的 SBOM 支持

Spring Boot 3.3.0 已经发布,其中包含对 SBOM 的支持。SBOM 是 “Software Bill of Materials”(软件物料清单)的缩写,描述了用于构建软件构件的组件。在本文中,这些组件就是你的 Spring Boot 应用。SBOM 非常有用,因为它们准确地描述了你的应用包含的内容。有了这些信息,你可以评估安全漏洞是否影响你的应用,或者使用自动化安全工具扫描你的应用程序并提醒你存在的安全漏洞。 目前有多种 SBOM 格式,使用最广泛的是 CycloneDX、SPDX 和 Syft。Spring Boot 3.3.0 开箱即支持 CycloneDX。这种支持包括以下三个方面: 配置 CycloneDX 插件,以便在构建应用时生成 SBOM。 将生成的 SBOM 文件打包到 uber jar 中。 Actuator 端点,用于显示生成的 SBOM(如果启用)。 来看看如何进行实际操作: 首先,在 start.springboot.io 上生成一个新项目(确保选择 Spring Boot 3.3.0),并添加以下依赖: Spring Web Actuator 然后,在 IDE 中打开生成的项目,如果使用的是 Gradle,将以下内容添加到你的 build.gradle 文件中: plugins { id 'org.cyclonedx.bom' version '1.8.2' } 这将在构建中应用 CycloneDX Gradle plugin。Spring Boot 会检测到这一点,并负责插件的配置,你无需再做任何更改。 如果使用的是 Maven,则在 pom.xml 中加入以下内容: