Я сопоставил две сущности с этими следующими классами:
@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 не работает с коллекциями и массивами, но работает в моем первом случае.