Lombok、Spring mongodb 和 jackson 构造函数问题

Posted

技术标签:

【中文标题】Lombok、Spring mongodb 和 jackson 构造函数问题【英文标题】:Lombok, Spring mongodb and jackson Constructor problem 【发布时间】:2019-02-11 16:20:03 【问题描述】:

我在我的项目中使用 Spring Boot 和 lombok,但遇到了一些问题。 我的班级是这样的:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Data;

@Data
@Document(collection = "elements")
public class ElementEntity 

    @Id
    private String id;
    // ...

现在,如果我使用 jackson ObjectMapper 创建 ElementEntity,我会收到以下运行时错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 不能 构造ElementEntity 的实例(无创建者,默认 构造,存在):不能从对象值反序列化(没有委托- 或基于属性的创建者)

但如果我从 lombok 添加@NoArgsConstructor,我会收到以下编译错误:

[ERROR] ElementEntity.java:[11,1] 构造函数 ElementEntity() 是 已在 ElementEntity 类中定义

似乎@Document 增加了一个,但可能只有包可见性。有没有简单的方法来解决这个问题,或者我必须手动为每个 @Document 添加一个公共的无参数构造函数?

【问题讨论】:

lombok 的版本是多少? @benjaminc 我目前使用的是 1.16.22 【参考方案1】:

它是lombok 1.16.22中的一个错误,请尝试升级到1.18.0,

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.0</version>
    <scope>provided</scope>
</dependency>

Read

【讨论】:

谢谢,我刚才也找到了这个帖子,但是没有得到它在更高版本的lombok中已修复。现在使用 1.18.2【参考方案2】:

尝试将 id 字段定义更改为:

@Id
@Getter
@Setter
private String id;

【讨论】:

嗯,\@Data 应该负责所有的 setter 和 getter。但它只添加了 \@RequiredArgsConstructor 而不是杰克逊似乎需要的 \@NoArgsConstructor。

以上是关于Lombok、Spring mongodb 和 jackson 构造函数问题的主要内容,如果未能解决你的问题,请参考以下文章

将 lombok 与 gradle 和 spring-boot 一起使用

Lombok 不适用于 spring-boot-maven

Spring boot Lombok

Spring boot Lombok

Spring学习笔记:尝试Lombok简化实体类代码

拥有实体实例 - Spring 和 Lombok 不再引用具有 cascade="all-delete-orphan" 的集合