gpt4 book ai didi

java - Lombok - java.lang.StackOverflowError : null on toString method

转载 作者:可可西里 更新时间:2023-11-01 09:58:32 26 4
gpt4 key购买 nike

我有两个类 ProductCategorie。当我想使用 categoryRepository.save(c1) 修改类别中的产品列表时,如下面的代码所示,出现此错误:

 java.lang.StackOverflowError: null
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449) ~[na:1.8.0_191]
at java.lang.StringBuilder.append(StringBuilder.java:136) ~[na:1.8.0_191]
at org.sid.entities.Product.toString(Product.java:12) ~[classes/:na]
at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_191]
at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_191]
at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[na:1.8.0_191]
at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_191]
at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_191]
at org.sid.entities.Categorie.toString(Categorie.java:15) ~[classes/:na]
at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_191]

@Document
@Data @AllArgsConstructor @NoArgsConstructor @ToString
public class Categorie {
@Id
private String id;
private String name;
@DBRef
@JsonIgnore
private Collection<Product> products=new ArrayList<>();

@Document
@Data @AllArgsConstructor @NoArgsConstructor @ToString
public class Product {
@Id
private String id;
private String name;
private double price;
@DBRef
private Categorie categorie;

@Bean
CommandLineRunner start(CategoryRepository categoryRepository, ProductRepository productRepository){

return args -> {
categoryRepository.deleteAll();
Stream.of("c1 Ordinateur","c2 Imprimente").forEach(c->{
categoryRepository.save(new Categorie(c.split(" ")[0],c.split(" ")[1],new ArrayList<>()));
});
categoryRepository.findAll().forEach(System.out::println);

productRepository.deleteAll();
Categorie c1=categoryRepository.findById("c1").get();
Stream.of("P1","P2","P3","P4").forEach(name->{
Product p= productRepository.save(new Product(null,name,Math.random()*1000,c1));
c1.getProducts().add(p);
categoryRepository.save(c1);
});

productRepository.findAll().forEach(p->{
System.out.println(p.toString());
});

};
}

任何人都可以解决这个问题吗?谢谢。

最佳答案

您在 Lombok 生成的 toString 方法中有一个循环引用。

  • Product 引用 toString 上的 Categorie,后者引用 Product,依此类推

您可以使用排除属性 @ToString,但它很快就会被弃用,因此请使用 @ToString.Exclude:

@Document
@Data @AllArgsConstructor @NoArgsConstructor @ToString
public class Product {
...

@ToString.Exclude
private Categorie categorie;

...
}

@Document
@Data @AllArgsConstructor @NoArgsConstructor @ToString
public class Categorie {
...

@ToString.Exclude
private Collection<Product> products=new ArrayList<>();

...
}

Lombok 引用 herehere

关于java - Lombok - java.lang.StackOverflowError : null on toString method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54653734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com