Quarkus 和 Jackson 奇怪的龙目岛行为

Posted

技术标签:

【中文标题】Quarkus 和 Jackson 奇怪的龙目岛行为【英文标题】:Strange Lombok behaviour with Quarkus and Jackson 【发布时间】:2020-03-13 15:21:50 【问题描述】:

目前我面临一个奇怪的问题。我在我的 Quarkus 项目中使用 lombok 来自动生成 getter、setter 等。当我将 Quarkus 编译为本机图像时,Jackson 拒绝序列化 Lombok-Data-Object,但序列化另一个没有问题。

更奇怪的是,这个错误只会在我编译原生二进制文件并将其嵌入容器时发生。在“quarkus:dev”配置文件中运行这两个示例完美无缺。

这个类的对象被序列化:

@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "accounts")
public class AccountEntity 

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "id", updatable = false, nullable = false)
    private UUID id;

    @Column(unique = true, name = "username", nullable = false)
    private String username;

    @Column(unique = true, name = "mail", nullable = false)
    private String mail;

    @Column(name = "password", nullable = false)
    private String password;


这个类的对象不会:

@Getter
@AllArgsConstructor
public class LoginResponse 
    private final String token;

错误信息:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class de.alexzimmer.pwa.model.LoginResponse and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

但即使我查看生成的类文件,我也可以看到生成的两个类的公共 getter。我很感谢任何关于如何发生这种情况的建议和想法。

谢谢!

【问题讨论】:

【参考方案1】:

您必须通过添加 @RegisterForReflection 注释来注册此类以进行反射。

它适用于第一个对象,因为它是一个实体,这是自动完成的。

请参阅https://quarkus.io/guides/writing-native-applications-tips#registering-for-reflection 了解完整说明。

我可能会在那里添加 Jackson 错误消息,以便更容易找到它。

【讨论】:

以上是关于Quarkus 和 Jackson 奇怪的龙目岛行为的主要内容,如果未能解决你的问题,请参考以下文章

本机的 quarkus resteasy-jackson 空 json 结果

Lombok + Jackson 不可变

龙目岛没有创建默认构造函数导致杰克逊数据绑定失败[重复]

Eclipse龙目岛错误

序列化 Hibernate 对象时抛出奇怪的 Jackson 异常

DynamoDB + Quarkus - 奇数类型转换