java - Jackson @JsonIgnoreProperties 无法在父类(super class)中工作

标签 java json spring-boot jackson

我有一个名为“BaseEntity”的类。从基础实体扩展的其他实体。

基础实体

@MappedSuperclass
public abstract class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @ManyToOne
    @JsonIgnoreProperties({"createdBy", "lastModifiedBy", "manager"})
    private User createdBy;

    private Instant createdDate = Instant.now();

    @ManyToOne
    @JsonIgnoreProperties({"createdBy", "lastModifiedBy", "manager"})
    private User lastModifiedBy;

    private Instant lastModifiedDate = Instant.now();

    // getters & setters
}

从基础实体扩展的用户实体。

@Entity
public class User2 extends BaseEntity {

    private String userName;

    @ManyToOne
    @JsonIgnoreProperties({"createdBy", "lastModifiedBy", "manager"})
    private User manager;

    // getters & setters
}

错误 当我尝试序列化用户时出现此错误。

org.springframework.http.converter.HttpMessageConversionException:类型定义错误:[简单类型,类a.b.c.d.domain.User];嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:直接自引用导致循环(通过引用链:java.util.Collections$UnmodifyingRandomAccessList[0]->a.b.c.d.domain.User["createdBy"])

如果我像这样只更改createdBy和lastModifiedBy,它就可以工作。经理用户不会导致错误

    @ManyToOne
    @JsonIgnore
    private User createdBy;

但是这次 json 不包含任何createdBy 或lastModifiedBy 信息。

{
  "id": 2,
  "userName": "admin",
  "manager": {
    "id": 1,
    "username": "system"
  }
}

我只是想看看这个 json。第一步必须包含createdBy和lastModifiedBy。

{
  "id": 2,
  "userName": "admin",
  "manager": {
    "id": 1,
    "username": "system"
  },
  "createdBy": {
    "id": 1,
    "username": "system"
  },
  "lastModifiedBy": {
    "id": 2,
    "username": "admin"
  }
}

最佳答案

正确的使用方法是在类级别。这些属性在 JSON 序列化和反序列化中被认为是被忽略的。

示例:-

@JsonIgnoreProperties({ "bookName", "bookCategory" })
public class Book {
   @JsonProperty("bookId")
   private String id;

   @JsonProperty("bookName")        
   private String name;

   @JsonProperty("bookCategory")    
   private String category;  

} 

如果您想在字段级别忽略,可以使用@JsonIgnore

关于java - Jackson @JsonIgnoreProperties 无法在父类(super class)中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58445279/

相关文章:

java - 只插入一次

java - Java 中的 ".class"错误

javascript - 将空值替换为 JSON OBJECT 中的空值

spring - 如何使用Spring Boot设置SpringFox以显示Rest API的两个(或更多)版本?

java - testcontainers oracle 数据库容器在创建数据库用户之前启动

Java - MySQL - 连接到 mysql 数据库时出错

java - 启动新 Activity 时,带有 WebView 的 Android Activity 崩溃

json - 在 Groovy/Grails 中生成的 JSON 中插入嵌套项

json - 将具有不同模式的 json 加载到 PIG 中

spring-boot - Ansi将颜色消息输出到控制台与文件