本机的 quarkus resteasy-jackson 空 json 结果

Posted

技术标签:

【中文标题】本机的 quarkus resteasy-jackson 空 json 结果【英文标题】:quarkus resteasy-jackson empty json result for native 【发布时间】:2020-03-08 12:58:00 【问题描述】:

使用我的 rest 端点 /init

测试 quarkus 应用程序

已安装的功能:[cdi、resteasy、resteasy-jackson]

我发现当以 java(非本机)运行应用程序时,请检查 http://localhost:8080/init


"user": 
"username": "u name",
"firstName": "f name",
"lastName": "l name",
"email": null
,
"logoutUrl": "url!!!!"

作为本地人,

并像这样本地运行: 包 -Dnative -f pom.xml

然后运行 ​​./my-service-1.0-SNAPSHOT-runner:

它得到 empty 结果: http://localhost:8080/init


Jackson 配置如下:

    @Singleton
public class RegisterCustomModuleCustomizer implements ObjectMapperCustomizer 

    public void customize(final ObjectMapper objectMapper) 
        objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    

没有例外。

InitData 像这样定义,作为普通的 bean 类:

    public class InitData 

        private .. some fields

可能缺少什么?它不应该适用于本机/java吗?


更新

以java运行时,编译quarkus:dev -f pom.xml:

[INFO] 正在扫描项目... [INFO] [INFO] ------------------------ [INFO] 构建我的服务 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------- ------------------------ [信息] [信息] --- maven-resources-plugin:2.6:resources (default-resources) @ my-service --- [INFO] 使用 'UTF-8' 编码复制过滤的资源。 [INFO] 复制 1 个资源 [INFO] [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @my-service --- [INFO] 检测到更改 - 重新编译模块! [信息] 编译 41 源文件到 /home/me/projects/my-project/v2/my-service-quarkus/target/classes [INFO] [INFO] --- quarkus-maven-plugin:1.0.0.CR1:dev (default-cli) @ my-service --- 在地址监听传输 dt_socket:5005 2019-11-12 14:17:43,027 信息 [io.qua.dep.QuarkusAugmentor](主要) 开始 quarkus 增强 2019-11-12 14:17:43,599 INFO [io.qua.arc.pro.BeanProcessor] (build-1) 发现不推荐使用 应用程序 bean 中的私有成员(改用 package-private): - @Inject 字段 my.compnay.application.InitResource#initFacadeService 2019-11-12 14:17:43,658 INFO [io.qua.dep.QuarkusAugmentor](主要) Quarkus 增强在 631 毫秒内完成 2019-11-12 14:17:44,104 INFO [io.quarkus] (main) Quarkus 1.0.0.CR1 开始于 1.260s。收听: http://0.0.0.0:8080 2019-11-12 14:17:44,105 INFO [io.quarkus](主要) 配置文件开发已激活。激活实时编码。 2019-11-12 14:17:44,105 INFO [io.quarkus] (main) 安装的功能:[cdi, resteasy, resteasy-jackson]

然后点击:http://localhost:8080/init

2019-11-12 14:19:52,423 信息 [com.dis.pla.app.ser.fil.LoggingFilter] (vert.x-worker-thread-1) 从 IP 请求 GET /init 0:0:0:0:0:0:0:1:48810 2019-11-12 14:19:52,425 信息 [com.dis.pla.app.InitResource] (vert.x-worker-thread-1) 与用户一起初始化 f 名称 my.compnay.api.UserData@37ac6925

--

【问题讨论】:

一个疯狂的猜测,但是您是否在包含 InitData 的项目上运行 Jandex?您在运行 quarkus:dev 时是否收到有关此类的任何警告? 不确定 Jandex,将检查(它基于 hello-world 示例)。但更新了问题。添加了java案例的日志。 不,日志中没有关于 InitData 的警告。我不知道。 我们可以看看您的 JAX-RS 端点是什么样子的吗? 【参考方案1】:

@RegisterForReflection(来自here)是在您的资源不直接返回该数据对象时用于数据对象的注释。

即就我而言:

  @GET
    public Response getInit(

因此,在你放之前它不会天生起作用:

@RegisterForReflection
class InitData  ...

但还是这样。

我认为我应该是一个错误。它的行为方式都应该相同。原生与否。

【讨论】:

解决了我的问题,谢谢!这让我想知道,因为我有 15 个几乎相同的资源类,并且除了这个之外,它们都运行良好。对我来说,唯一的区别是大多数是 JPA @Entity,而这个不是。这让我想知道在以不同方式修复之前,注释所有 Dto 是否不应该成为一种常见做法(我在 Quarkus 文档中没有找到)。【参考方案2】:

我也认为这是一个错误,但他们在这里解释得更好:https://quarkus.io/guides/writing-native-applications-tips#registering-for-reflection

When building a native executable, GraalVM operates with a closed world 
assumption. It analyzes the call tree and removes all the classes/methods/fields 
that are not used directly.

The elements used via reflection are not part of the call tree so they are dead
code eliminated (if not called directly in other cases). To include these 
elements in your native executable, you need to register them for reflection
explicitly.

【讨论】:

以上是关于本机的 quarkus resteasy-jackson 空 json 结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用quarkus创建本机可执行文件?

应"云"而生的 Java 框架 Quarkus:构建本机可执行文件

在本机编译期间,如何在 Quarkus maven 插件中将参数添加到 GraalVM?

Quarkus 和 Jackson 奇怪的龙目岛行为

JVM的下一代—GraalVM介绍

云原生时代高性能Java框架—Quarkus