本文介绍了龙目岛-java.lang.StackOverflowError:toString方法上为null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两个类Product
和Categorie
.如下面的代码所示,当我想用categoryRepository.save(c1)
修改类别的产品列表时,会发生此错误:
I have two classes Product
and Categorie
. When I would like to modify the list of products in categorie with categoryRepository.save(c1)
as shown in the code below, this error occurs:
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());
});
};
}
有人可以解决这个问题吗?谢谢.
Can anyone have an idea to solve this issue? Thanks.
推荐答案
您在Lombok生成的toString
方法中具有循环引用.
You are having a circular reference in the toString
method generated by Lombok.
-
Product
引用了toString
上的Categorie
,引用了Product
,依此类推
Product
is referencingCategorie
ontoString
, which is referencingProduct
, and so on
您可以使用排除属性@ToString
,但很快就会弃用它,因此请使用@ToString.Exclude
:
You could use the exclude a property @ToString
, but it is going to be deprecated soon, so use the @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 refs here and here
这篇关于龙目岛-java.lang.StackOverflowError:toString方法上为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!