我不明白为啥我对 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();
    

【问题讨论】:

似乎CartItemhashCode 也试图调用ShoppingCarthashCode,这会导致您描述的确切问题,除了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 有问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我的 Heroku 构建一直失败,我不知道为啥

阿里插件检查 lombok报错---方法缺少 '@Override' 注解

我不明白为啥我的手机没有出现?

我不明白为啥会这样编译

元数据已还原,我不明白为啥

我不明白为啥会出现语法错误