REST API:JAX-RS 与 Spring

1、概览 本文将带你了解 JAX-RS 和 Spring MVC 在 REST API 开发方面的区别。 2、Jakarta RESTful Web 服务 要成为 Jakarta EE 世界的一部分,一项功能必须具备规范、兼容的实现和 TCK(技术兼容套件)。JAX-RS 就是一套用于构建 REST 服务的规范。其最著名的参考实现是 RESTEasy 和 Jersey。 现在,通过实现一个简单的 Controller 来熟悉一下 Jersey: @Path("/hello") public class HelloController { @GET @Path("/{name}") @Produces(MediaType.TEXT_PLAIN) public Response hello(@PathParam("name") String name) { return Response.ok("Hello, " + name).build(); } } 上面的代码中,端点返回一个简单的 “text/plain” 响应,这是由 @Produces 注解指定的。具体来说,暴露了一个名为 hello 的 HTTP 资源,它接受一个名为 name 的参数,使用了两个 @Path 注解进行路径的定义。还使用 @GET 注解指定它是一个 GET 请求。 3、使用 Spring MVC 实现 REST Spring MVC 是 Spring Framework 的一个模块,用于创建 Web 应用程序。它为 Spring Framework 添加了 REST 功能。

Spring 中的 @EntityScan 和 @ComponentScan 注解

1、概览 在 Spring 应用中,我们通常使用 @EntityScan 来指定实体类所在的包,使用 @ComponentScan 来指定 Bean 组件所在的包。 组件是带有 @Controller、@Service、@Repository、@Component、@Bean 等注解的类。实体则是带有 @Entity 注解的类。 本文将带你了解 @EntityScan 和 @ComponentScan 注解在 Spring 中的用法和区别。 2、@EntityScan 注解 在 Spring 中,有 2 种方式放置 @Entity 实体类: 在 main 包或者其子包下 在完全不同的 root 包中 在第一种情况下,可以使用 @EnableAutoConfiguration 来启用 Spring 自动配置 Application Context。 在第二种情况下,需要用 @EntityScan 来告诉 Spring 实体所在的包,如下。 @Configuration @EntityScan("com.baeldung.demopackage") public class EntityScanDemo { // ... } 注意,使用 @EntityScan 会禁用 Spring Boot 对实体的自动扫描配置。 3、@ComponentScan 注解 与 @EntityScan 和实体类似,如果我们希望 Spring 只使用一组特定的 Bean 类,可以使用 @ComponentScan 注解。

Spring Boot 3.2 中开箱即用的虚拟线程和 GraalVM

Spring Boot 3.2 前几天 发布 了,让我们用 Java 21、GraalVM 和 Virtual Threads(虚拟线程)来快速体验一下。 Spring Boot 3.2 支持: Java 21 虚拟线程 原生镜像(自 2022 年 11 月 Spring Boot 3.0 发布以来,Spring Boot 已在生产中支持 GraalVM 原生镜像) Java 21 2023 年 9 月 19 日 Java 21 发布。 正如宣布的那样,Java 21 在性能、稳定性和安全性方面进行了数千项改进,包括平台增强功能,这有助于开发人员提高生产力,推动整个组织的创新和发展。 Project Loom 其中一个比较重要的更新是虚拟线程(Virtual Thread),这是 Project Loom 提供的功能。具体细节这里就不多说了,你可以参考官方的 JEP:https://openjdk.org/jeps/444。 GraalVM 和 Native image GraalVM 是一款高性能 JDK,可使用另一种即时(JIT)编译器提高 Java 和基于 JVM 的应用程序的性能。 原生镜像(Native image)是一种将 Java 代码提前编译成独立可执行文件(称为原生镜像)的技术。该可执行文件包括应用程序类、其依赖项中的类、运行时库类以及 JDK 中静态链接的本地代码。

使用 RestClient 上传文件、JSON 和表单数据

前几天 Spring Boot 3.2 正式 发布 了,本次发布带来了一个新的 HTTP 客户端:RestClient,它提供了 Fluent 风格的 API,比起 RestTemplate 来说更加优雅。 关于 RestClient 的更多信息,你可以参考如下文章: Spring RestClient 教程 Spring 6.1的新特性:RestClient 本文将会带你了解如何使用 RestClient 同时上传文件、JSON 和表单数据。 关于如何使用 RestTemplate 进行文件上传,你可以参考 “RestTemplate 上传文件” 和 “在 Spring Boot 应用中同时上传文件、JSON和表单数据”。 本文使用的 Spring Boot 版本为 3.2.0。 创建 Controller 首先在 Spring Boot 应用中,创建一个处理 multipart/form-data 文件上传请求的 Controller。 package cn.springdoc.demo.web.controller; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.

Spring Security Oauth 授权服务器

1、简介 OAuth 是一种描述授权过程的开放标准。它可用于授权用户访问 API。例如,REST API 可以限制只有具有适当角色的注册用户才能访问。 OAuth 授权服务器负责认证用户身份,并签发包含用户数据和适当访问策略的访问令牌(Access Token)。 本将带你了解如何使用 Spring Security OAuth 授权服务器 实现一个简单的 OAuth 应用。 我们要创建一个 CS 应用,通过 REST API 获取资源服务器上的文章列表。客户端服务和服务器服务都需要 OAuth 身份认证。 2、授权服务器实现 先来看看 OAuth 授权服务器的配置。它作为文章资源和客户端服务器的身份认证源。 2.1、依赖 首先,在 pom.xml 中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>2.5.4</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-authorization-server</artifactId> <version>0.2.0</version> </dependency> 2.2、配置 在 application.yml 文件中,设置 server.port 属性来配置认证服务器的运行端口: server: port: 9000 然后,就可以开始配置 Spring Bean 了。首先,需要一个 @Configuration 类,在该类中创建一些 OAuth 特有的 Bean。 第一个是客户端服务的 Repository。在本例中,使用 RegisteredClient Builder 类创建一个客户端:

获取 Spring Boot 中的所有端点

1、概览 本文将带你了解如何获取 Spring Boot 应用中的所有 REST 端点。 2、映射端点 在 Spring Boot 应用中,通过在 Controller 类中使用 @RequestMapping 注解来暴露 REST API 端点。要获取这些端点,有三种选择:事件监听器、Spring Boot Actuator 或 SpringDoc。 3、事件监听器 在 Controller 中使用 @RestController 和 @RequestMapping 创建 REST API 服务。这些类在 Spring Application Context 中注册为 Spring Bean。因此,当 Application Context 在启动时准备就绪,就可以使用事件监听器获取端点。定义监听器有两种方法。可以实现 ApplicationListener 接口,或者使用 @EventListener 注解。 3.1、ApplicationListener 接口 在实现 ApplicationListener 时,必须定义 onApplicationEvent() 方法: @Override public void onApplicationEvent(ContextRefreshedEvent event) { ApplicationContext applicationContext = event.getApplicationContext(); RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext .getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class); Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping .

Spring Boot 3.2.0 发布

该版本增加了大量新功能和改进。有关完整的 升级说明 以及 新的和值得注意 的功能,请参阅 发布说明。 3.2 中的新特性 3.2 版的亮点包括: 支持虚拟线程(Virtual Threads) 初步支持 JVM Checkpoint Restore(Project CRaC) SSL Bundle 重新加载 大量可观测性的改进 支持 RestClient 支持 JdbcClient 支持 Jetty 12 为 Apache Pulsar 提供 Spring 支持 为 Kafka 和 RabbitMQ 提供 SSL Bundle 支持 重新处理了嵌套 Jar 文件的处理方式 改进 Docker Image 构建 依赖升级 Spring Boot 3.2 迁移到了多个 Spring 项目的新版本,还尽可能升级到了其他第三方库的最新稳定版本。详情请参见 发布说明。 其他变化 发行说明 中还记录了许多其他更改和改进。还可以找到计划在未来删除的废弃类和方法列表。 Ref:https://spring.io/blog/2023/11/23/spring-boot-3-2-0-available-now

解决 Spring 中 “not eligible for auto-proxying” 警告

1、概览 本文将带你了解出现 “not eligible for auto-proxying” 警告的原因以及如何修复它。 2、“not eligible for auto proxying” 的原因 2.1、配置示例 首先,创建一个自定义 RandomInt 注解,使用它来注解应该插入指定范围内的随机整数的字段。 @Retention(RetentionPolicy.RUNTIME) public @interface RandomInt { int min(); int max(); } 其次,创建一个简单的 Spring 组件 DataCache 类。将一个可能被使用的随机 Group 分配给缓存,例如用于支持分片。为了实现这一点,使用自定义的注解来注解该字段: @Component public class DataCache { @RandomInt(min = 2, max = 10) private int group; private String name; } 现在,来看看 RandomIntGenerator 类。它是一个 Spring 组件,用于在 RandomInt 注解注解的字段中插入随机 int 值: @Component public class RandomIntGenerator { private Random random = new Random(); private DataCache dataCache; public RandomIntGenerator(DataCache dataCache) { this.

Spring Boot Actuator 中的端点管理

1、概览 本文将带你了解如何通过 properties 文件控制 Spring Boot Actuator 端点的状态,以及如何保证端点的安全。 2、设置 为了使用 Actuator,需要在 Maven 配置中包含 spring-boot-starter-actuator: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>3.1.2</version> </dependency> 此外,从 Spring Boot 2.0 开始,如果想通过 HTTP 暴露端点,就需要包含 Web Starter: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.1.2</version> </dependency> 3、启用和暴露端点 默认情况下,除 /shutdown 之外的所有端点都已启用,只有 /health 和 /info 被暴露。即使为应用配置了不同的 Root Context,也能在 /actuator 中找到所有端点。 这意味着,一旦在 Maven 配置中添加了相应的 Stater,就可以访问 http://localhost:8080/actuator/health 和 http://localhost:8080/actuator/info 上的 /health 和 /info 端点。 访问 http://localhost:8080/actuator,查看可用端点列表,因为 Actuator 端点已启用 HATEOS。所以,应该能看到 /health 和 /info。 {"_links":{"self":{"href":"http://localhost:8080/actuator","templated":false}, "health":{"href":"http://localhost:8080/actuator/health","templated":false}, "info":{"href":"http://localhost:8080/actuator/info","templated":false}}} 3.1、暴露所有端点 现在,修改 application.

Spring Boot 和 JSP(Java Server Pages)

1、概览 在构建 Java Web 应用时,可以使用 Java Server Pages(JSP)作为 HTML 页面模板。 Spring Boot 是一个流行的框架,可以用它来快速开发 Java Web 应用。 但是,在 Spring Boot 中使用 JSP 有一定的局限性,应该考虑用 Thymeleaf 或 FreeMarker 来替代 JSP。 2、Maven 依赖 首先来看看在 Spring Boot 中使用 JSP 需要哪些依赖。 2.1、作为独立应用运行 首先,添加 spring-boot-starter-web 依赖。 该依赖提供了使用 Spring Boot 和默认的嵌入式 Tomcat Servlet 容器来运行 Web 应用的所有核心依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.4.4</version> </dependency> 注意,使用 Undertow 作为嵌入式 Servlet 容器使用时不支持 JSP。 接下来,需要添加 tomcat-embed-jasper 依赖,以便应用能够编译和渲染 JSP 页面: <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.44</version> </dependency> 虽然可以手动提供上述两个依赖,但通常最好让 Spring Boot 管理这些依赖的版本,而我们只需管理 Spring Boot 版本即可。