【问题标题】: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.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)

当我在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();
    }
}

【问题讨论】:

  • 似乎CartItemhashCode 也试图调用ShoppingCarthashCode,这会导致您描述的确切问题,除了hashCode 而不是toString。我不知道龙目岛的细节,但似乎你必须从equals/hashCode 计算中排除shoppingCart 属性以打破循环。

标签: java tostring lombok


【解决方案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。

【讨论】:

  • 我是怎么做到的?
  • 我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 2021-04-26
  • 2020-02-13
  • 2022-08-08
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
相关资源
最近更新 更多