springboot3整合JAX-RS
介绍
Spring Boot 与 JAX-RS 的整合通常用于构建基于标准介口的 RESTful 服务。JAX-RS 是 Java 的标准解决方案,并不为 Spring 和 Spring Boot 定制。基于此,为了在 Spring Boot 中配置 JAX-RS,需要优化配置和根据需求进行展开。
实现步骤
1. 安装依赖
在基于 Maven 的 springboot3 项目中添加 JAX-RS 相关依赖,如 Jersey、RESTEasy 等实现。
Maven
<!-- JAX-RS Implementation (Jersey) -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
</dependency>
<!-- Jersey Spring Integration -->
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring6</artifactId>
</dependency>
<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>jakarta.activation-api</artifactId>
<version>2.1.3</version> <!-- 请根据实际需要调整版本 -->
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version> <!-- 请根据实际需要调整版本 -->
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.0</version> <!-- 请根据实际需要调整版本 -->
</dependency>
2. 配置 Jersey 等实现
在 Spring Boot 中配置 Jersey,将其作为一个独立的配置类:
例子
package com.bingbaihanji.blog.config;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
// 注册你的资源类
packages("com.bingbaihanji.blog.controller.jaxrs"); // 替换为你的资源类包路径
// 禁用 WADL 功能
// property("jersey.config.server.wadl.disableWadl", true);
}
}
3. 实现资源类
JAX-RS 的资源类通常通过 @Path
和 HTTP 流程相关注解实现:
示例
package com.bingbaihanji.blog.controller.jaxrs;
import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
import java.io.IOException;
import java.io.InputStream;
/**
* FaviconController 类用于处理 favicon 和简单文本返回的 JAX-RS 接口请求
*/
@Controller
@Slf4j
@ApplicationPath("/") // 定义 JAX-RS 的根路径
@Path("/") // 定义资源的根路径为 "/"
public class FaviconController {
/**
* 处理 GET 请求,路径为 "/hello"
* 返回简单的文本响应 "Hello, Jakarta EE!"
*
* @return "Hello, Jakarta EE!" 文本内容
*/
@GET
@Path("/hello") // 定义此方法处理的路径为 "/hello"
@Produces(MediaType.TEXT_PLAIN) // 定义返回内容类型为纯文本
public String sayHello() {
return "Hello, JAX-RS!";
}
/**
* 处理 GET 请求,路径为 "/favicon.ico"
* 加载类路径下的 favicon 图标并返回给客户端
*
* @return 包含 favicon 图标的 Response 对象
* @throws IOException 如果加载图标文件失败时抛出异常
*/
@GET
@Path("/favicon.ico") // 定义此方法处理的路径为 "/favicon.ico"
@Produces("image/gif") // 定义返回内容类型为 GIF 图片
public Response favicon() throws IOException {
// 使用 ClassPathResource 加载类路径下的 "image/8b1Qt7yNlVRohJA.gif" 文件
try (InputStream in = new ClassPathResource("image/8b1Qt7yNlVRohJA.gif").getInputStream()) {
// 读取文件内容为字节数组
byte[] bytes = in.readAllBytes();
// 返回包含图片数据的响应对象,并设置响应类型为 "image/gif"
return Response.ok(bytes).type("image/gif").build();
}
}
}
4. 配置消息转换器
如需控制 JSON 转换,可以通过添加 Jackson 实现:
Maven
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
</dependency>
配置
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
packages("com.example.jaxrs.resources");
register(org.glassfish.jersey.jackson.JacksonFeature.class); // 添加 Jackson 支持
}
}
敏感点
- 请确保 JAX-RS 的版本与 Spring Boot 配套,避免发生冲突。
- 如需与 Spring MVC 整合,需配置好命举合适性问题,避免路径冲突。
完整代码
Application 启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class JaxrsApplication {
public static void main(String[] args) {
SpringApplication.run(JaxrsApplication.class, args);
}
}
通过上述步骤,已经完成了 Spring Boot 整合 JAX-RS 的配置和实现!
测试
访问 http://127.0.0.1:8080/hello
,http://127.0.0.1:8080/favicon.ico