Джексон @JsonIgnoreProperties, кажется, не работает все время - PullRequest
0 голосов
/ 09 июля 2019

Я сопоставил две сущности с этими следующими классами:

@Getter
@Entity
@Table(name = "users")
@JsonIdentityInfo(generator = PropertyGenerator.class,
                  property  = "id")
@SequenceGenerator(name = "id-generator", sequenceName = "seq_users")
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
@NoArgsConstructor(access = PROTECTED)
@RequiredArgsConstructor
public class User extends IdentifiedById {

    @Include
    @NonNull
    @Column(name = "email_address", unique = true)
    private String emailAddress;

    @Setter
    @JsonIgnore
    private String hash;

    @Setter
    private boolean admin;

    @OneToMany(
            mappedBy = "user",
            orphanRemoval = true,
            cascade = ALL
    )
    @JsonIgnoreProperties("user")
    private Set<Cart> carts;

    {
        carts = new HashSet<>(0);
    }
}

@Getter
@Entity
@Table(
        name = "carts",
        uniqueConstraints = @UniqueConstraint(
                columnNames = {
                        "creation_time",
                        "user_id"
                }
        )
)
@JsonIdentityInfo(generator = PropertyGenerator.class,
                  property  = "id")
@SequenceGenerator(
        name = "id-generator",
        sequenceName = "seq_carts"
)
@EqualsAndHashCode(
        callSuper = false
)
@RequiredArgsConstructor
@NoArgsConstructor(access = PROTECTED)
public class Cart extends IdentifiedById {


    @NonNull
    @Column(name = "creation_time")
    private LocalDateTime creationTime;

    @NonNull
    @ManyToOne(cascade = ALL)
    @JoinColumn(
            name = "user_id",
            referencedColumnName = "id"
    )
    @JsonManagedReference
    private User user;


    @Exclude
    @JsonProperty("productStoreQuantities")
    @JsonSerialize(converter = AdditionConverter.class)
    @OneToMany(mappedBy = "cart", orphanRemoval = true, cascade = ALL)
    private Set<Addition> additions;

    {
        additions = new HashSet<>(0);
    }
}

Если я получаю пользователя, его тележки не содержат его ссылки, это нормально для меня.Теперь, с точки зрения конечной точки отдыха, я бы не хотел сериализовать пользователей вместе с их тележками, если один из них запрашивает несколько пользователей, например:

/ api / users -> {"id": 1, "emailAddress": "test@test.test", "admin": false}

/ api / users / 1 -> {"id": 1, "emailAddress": "test @ test.test "," admin ": false," carts ": [...]}

Таким образом, я создал класс-обертку с именем Users, содержащий список пользователей, аннотированных @JsonValue и @JsonIgnoreProperties("тележки"):

@RequiredArgsConstructor
public class Users implements Serializable, List<User> {

    @Delegate
    @JsonValue
    @JsonIgnoreProperties("carts")
    private final List<User> values;
}

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

1 Ответ

0 голосов
/ 09 июля 2019

Вы должны использовать JsonIgnoreProperties на уровне класса. Это хорошо объясняется в этом посте

https://www.baeldung.com/jackson-ignore-properties-on-serialization

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