You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat JAX-RS服务迁移Quarkus:设置响应头、内容长度及媒体类型问题

从Tomcat迁移JAX-RS OTA固件下载服务到Quarkus的问题解决

问题背景

将Tomcat上的JAX-RS REST服务迁移至Quarkus时,OTA固件下载接口的实现存在疑问:原代码通过HttpServletResponse设置自定义响应头、内容长度和媒体类型,但Quarkus中无需直接操作HttpServletResponse,计划用ResponseBuilder构建响应,但不清楚如何实例化ResponseBuilder,以及内容长度、媒体类型的正确配置方式,同时不确定@Produces注解是否已覆盖媒体类型设置,内容长度是否会自动填充。

原Tomcat服务代码:

public class HomeAutomationService {
    ...
    @Context
    private HttpServletRequest request;
    ...

    @GET
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    @Path("/v1/DownloadFirmware")
    public Response getFirmware() {
       ...
       // 原代码中操作HttpServletResponse的逻辑
       response.setHeader("X-OTA-SIGNATURE", signatureString);
       response.setContentLength((int) file.length());
       response.setContentType(MediaType.APPLICATION_OCTET_STREAM);

       return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM).build();    
    }
}

解决方案

1. 实例化ResponseBuilder

无需手动实例化ResponseBuilder,直接调用Response类的静态方法即可获取实例,常用的有:

  • Response.ok():构建200 OK状态的响应构建器
  • Response.status():指定状态码构建响应构建器

2. 媒体类型的设置

  • 方法上已添加@Produces(MediaType.APPLICATION_OCTET_STREAM)注解,Quarkus的RESTEasy实现会自动将响应的Content-Type设置为该值,无需在ResponseBuilder中重复设置。
  • 若需动态修改媒体类型,可调用ResponseBuilder的type()方法,例如:Response.ok(file).type(MediaType.APPLICATION_OCTET_STREAM)

3. 内容长度的处理

当返回对象为File时,Quarkus会自动读取文件长度并设置Content-Length响应头,无需手动设置。如果特殊场景下需要手动指定,可通过header()方法添加:

.header("Content-Length", file.length())

4. 自定义响应头的添加

通过ResponseBuilder的header()方法添加自定义响应头,例如OTA签名头:

.header("X-OTA-SIGNATURE", signatureString)

完整的Quarkus实现代码

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;

@Path("/v1")
public class HomeAutomationService {

    @GET
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    @Path("/DownloadFirmware")
    public Response getFirmware() {
        // 假设此处已获取到固件文件file和签名signatureString
        File file = ...;
        String signatureString = ...;

        return Response.ok(file)
                .header("X-OTA-SIGNATURE", signatureString)
                // 若需要手动设置媒体类型,可添加type方法,否则依赖@Produces注解
                // .type(MediaType.APPLICATION_OCTET_STREAM)
                // 内容长度无需手动设置,Quarkus会自动处理
                // .header("Content-Length", file.length())
                .build();
    }
}

内容的提问来源于stack exchange,提问作者Rudolf Ziegaus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:24:25