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

人生不作安期生,醉入东海骑长鲸