如何解决我不明白为什么我对 Lombok 的 toString 有问题
我的问题是关于龙目岛的 @ToString
。
我不明白为什么我有这个错误:
java.lang.StackOverflowError
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)
当我排除 ShoppingCart
中 CartItem
的读数属性时。
这不是简单地取消循环吗?
在我看来:
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();
}
}
解决方法
您正在尝试打印已加入的模型类。所以在获取你想要的表数据的同时,也获取了其他连接的表。这会导致堆栈溢出错误。您可以使用 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。