提问者:小点点

为什么QUUKUS应用程序的同一个RestApi在“本地”或“jvm”模式下具有不同的响应?


下面的简单代码是带有reactive方法的quakus rest api的演示:

@Consumes
@Produces(MediaType.APPLICATION_JSON)
@Path("/api/v1/datasource")
public class DatasourceResource {

    @Inject
    DatabaseBoundary databaseBoundary;

    @POST
    @Path("/query")
    public Uni<Response> query(DatasourceQuery param) {
        DatasourceRecordDTO result = new DatasourceRecordDTO();
        result.setId("888");
        List<String> header = Arrays.asList("id", "name", "age");
        DatasourceRecordItem item = new DatasourceRecordItem();
        item.setKey("888");
        item.setValueList(Arrays.asList("123", "wkx", "26"));
        result.setHeader(header);
        result.setRows(List.of(item));

        result.setContent("ok");
        return Uni.createFrom().item(Response.ok(result).build());
    }
}

我试图用两种方式运行它:

  • 1)直接在Intelij Idea中运行或在构建后运行'quakus-run. jar'
  • 2)使用二进制可执行文件'xxx-SNAPSHOT-Runner'运行或构建镜像以在docker/k8s中运行

使用第一种方法,我可以对内容“{xx: xx,xx:xx}”做出正确的响应:

然而,对于秒,我只能有一个空的响应“{}”:

为什么响应在这两种运行模式下表现不同?

  • Quarkus版本:2.12.3.Final
  • 夸克-还原-反应-杰克逊:2.12.3.Final
  • graalvm版本:22.1.0-java11
  • 系统:MacOS x86 64

我试图更换返回型统一


共1个答案

匿名用户

这是不同的,因为DatasourceRecordDTO的序列化需要使用反射,GraalVM默认情况下不启用反射。

因此,在您的情况下,如果您使用@Register sterForReflection注释DatasourceRecordDTO,那么一切都应该按预期工作。

此外,如果您使用正在使用RESTEasy Reactive,则可以使用RestResponse

只是为了更详细地说明Uni