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 一起使用
拥有实体实例 - Spring 和 Lombok 不再引用具有 cascade="all-delete-orphan" 的集合