Джексон @JsonIgnoreProperties не работает из суперкласса - PullRequest
1 голос
/ 18 октября 2019

У меня есть класс с именем "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: Ошибка определения типа: [простой тип, класс abcddomain.User];Вложенное исключение - com.fasterxml.jackson.databind.exc.InvalidDefinitionException: прямая самостоятельная ссылка, ведущая к циклу (через цепочку ссылок: java.util.Collections $ UnmodifiableRandomAccessList [0] -> abcddomain.User ["madeBy"])

если я изменяю только созданныеBy и lastModifiedBy, это работает. Менеджер пользователя не вызывает ошибку

    @ManyToOne
    @JsonIgnore
    private User createdBy;

Но на этот раз json не содержит никакой информации createBy или lastModifiedBy.

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

Просто я хочу увидеть этот json. Первый шаг должен содержать созданныеBy и lastModifiedBy.

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

Ответы [ 3 ]

1 голос
/ 18 октября 2019

Правильный способ использования - на уровне класса. Считается, что эти свойства игнорируются при сериализации и десериализации JSON.

Пример: -

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

   @JsonProperty("bookName")        
   private String name;

   @JsonProperty("bookCategory")    
   private String category;  

} 

Если вы хотите игнорировать на уровне поля, вы можете использовать @JsonIgnore

0 голосов
/ 18 октября 2019

@ JsonIgnoreProperties (ignoreUnknown = true) попробуйте использовать это выше имени вашего класса. Когда мы передаем true элементу ignoreUnknown, то при десериализации, если у данных JSON есть поле, для которого нет логического свойства, тогда это поле JSON будет игнорироваться и не будет выдано никакой ошибки. Как то так:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Book {
    @JsonProperty("bookId")
    private String id; 
}
0 голосов
/ 18 октября 2019

Я думаю, что @JsonIgnoreProperties должен быть размещен на уровне класса, прямо перед тем, как вы объявите свой класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...