如果存在 quarkus-amazon-lambda-http 依赖项,Quarkus 项目 REST API 响应将挂起

问题描述 投票:0回答:1

我有以下最小的 Quarkus 项目示例。如果没有

quarkus-amazon-lambda-http
依赖项,项目会在调用 GET 端点时返回正确的响应,甚至是更大的响应(10,000 个项目)。

但是,当将

quarkus-amazon-lambda-http
依赖项添加到
pom.xml
时,可能的响应大小会受到严重限制。仅当响应大小非常小时,代码才会运行(适用于 50 个项目,但不适用于 100 个项目)。

当我在本地运行该项目时,返回响应代码 200 OK,但没有正文,并且它只是挂起并尝试无限期地检索正文(通过 Postman、浏览器、curl 尝试过)。

我尝试过 pom.xml 的反应式和非反应式依赖项,两者的结果相同。我也尝试过使用其他版本的 Quarkus,例如 3.6.0。

资源:

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/cars")
public class ExampleResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Car> cars() {
        List<Car> carList = new ArrayList<>();

        //works if there are only 50 items in list
        //without lambda dependency, works if there 10000+
        for (int i = 0; i < 100; i++) {
            carList.add(new Car(Long.valueOf(i), "Car(" + i + ")", Double.valueOf(i) * 100, Double.valueOf(i) + 100,
                    Double.valueOf(i), new Date(), new Date()));
        }

        return carList;
    }
}

模型对象:

@Data
@AllArgsConstructor
public class Car {
    private Long id;
    private String name;
    private Double weight;
    private Double length;
    private Double width;
    private Date dateBuilt;
    private Date dateAdded;
}

pom.xml 文件依赖项和版本:

<properties>
    <compiler-plugin.version>3.11.0</compiler-plugin.version>
    <maven.compiler.release>17</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
    <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
    <quarkus.platform.version>3.6.4</quarkus.platform.version>
    <skipITs>true</skipITs>
    <surefire-plugin.version>3.1.2</surefire-plugin.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>${quarkus.platform.group-id}</groupId>
            <artifactId>${quarkus.platform.artifact-id}</artifactId>
            <version>${quarkus.platform.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-arc</artifactId>
    </dependency>
    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-reactive-jsonb</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-amazon-lambda-http</artifactId>
    </dependency>
</dependencies>
java amazon-web-services aws-lambda quarkus resteasy
1个回答
0
投票

我发现,如果我计算响应正文大小并将该大小添加到 Content-Length 响应标头,则将检索请求正文。

@Provider
public class ContentLengthFilter implements ContainerRequestFilter, ContainerResponseFilter {
        
        private static final Jsonb jsonb = JsonbBuilder.newBuilder().build();
    
        
        @Override
        public void filter(ContainerRequestContext requestContext) {
            
        }
    
        @Override
        public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
            
            if (responseContext.getEntity() != null && MediaType.APPLICATION_JSON_TYPE.equals(responseContext.getMediaType())) {
                var entity = jsonb.toJson(responseContext.getEntity());
                responseContext.setEntity(entity);
                responseContext.getHeaders().add(HttpHeaders.CONTENT_LENGTH, entity.getBytes().length);
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.