我不明白为啥我对 Lombok 的 toString 有问题[重复]
Posted
技术标签:
【中文标题】我不明白为啥我对 Lombok 的 toString 有问题[重复]【英文标题】:I don't understand why i have a problem with toString of Lombok [duplicate]我不明白为什么我对 Lombok 的 toString 有问题[重复] 【发布时间】:2021-05-30 03:41:40 【问题描述】:我的问题是关于龙目岛的@ToString
。
我不明白为什么我有这个错误:
java.lang.***Error
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:120)
at com.protypangel.market_selling.entity.market.shopping.ShoppingCart.hashCode(ShoppingCart.java:11)
at com.protypangel.market_selling.entity.market.shopping.CartItem.hashCode(CartItem.java:9)
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124)
at com.protypangel.market_selling.entity.market.shopping.ShoppingCart.hashCode(ShoppingCart.java:11)
at com.protypangel.market_selling.entity.market.shopping.CartItem.hashCode(CartItem.java:9)
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124)
at com.protypangel.market_selling.entity.market.shopping.ShoppingCart.hashCode(ShoppingCart.java:11)
at com.protypangel.market_selling.entity.market.shopping.CartItem.hashCode(CartItem.java:9)
当我在CartItem
中排除ShoppingCart
的读数属性时。
这不是简单地取消循环吗?
在我看来:
ShoppingCart => CartItem =x=> ShoppingCart (great)
ShoppingCart => CartItem => ShoppingCart => ... (bad)
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ShoppingCart
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@ToString.Exclude @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@OneToOne(fetch = FetchType.EAGER) Client client;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "shoppingCart") Set<CartItem> items;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class CartItem
@Id private String id;
@ToString.Exclude @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@ManyToOne(fetch = FetchType.EAGER) ShoppingCart shoppingCart;
private String productReference;
@PrePersist void setId()
this.id = new StringBuilder(shoppingCart.getId().toString()).append("+").append(productReference).toString();
【问题讨论】:
似乎CartItem
的hashCode
也试图调用ShoppingCart
的hashCode
,这会导致您描述的确切问题,除了hashCode
而不是toString
。我不知道龙目岛的细节,但似乎你必须从equals
/hashCode
计算中排除shoppingCart
属性以打破循环。
【参考方案1】:
您正在尝试打印已加入的模型类。因此,在获取您想要的表数据时,也会获取其他连接的表。这导致堆栈溢出错误。您可以使用 DTO 类来打印属性。
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ShoppingCartDTO
private Long id;
Client client;
Set<CartItem> items;
public ShoppingCartDTO(ShoppingCart shoppingCart)
//setters here
也为 cartItem 创建 DTO。
【讨论】:
我是怎么做到的? 我已经更新了答案。以上是关于我不明白为啥我对 Lombok 的 toString 有问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章