我有以下最小的 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>
我发现,如果我计算响应正文大小并将该大小添加到 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);
}
}