*Error栈溢出异常

*Error栈溢出错误
一般栈溢出是因为在某个class A中调用了class A.所以就陷入了死循环. 
问题的基本原理如下:
Class A{
  public A(){
     a= new A();
  }
}


 
你说这能不造成java.lang.*Error嘛,所以写代码我们要避免写这样的代码,应该将其放入到 方法体中(自己的Constructer除外) 或者是放入到 Static 中,以上的代码用JVM的指令,其实如下:
0:   aload_0
1:   invokespecial  #1; //Method  java/lang/object .<init>
4:   aload_0 
5:   new  #2; //class A
8:   dup
9:   invokespecial  #3; //Method  java/lang/object .<init>
12: putfield    #4; //Field a:LA;
15: return
 

在这里  constructer 中是调用 init , 而 static 是调用 cinit , 固我们如果将自己的对象放入到 static 中是不会找成循环的, 而如果将自己本身放到 constructer 中他就会不段的调用 init , 所以才发生了上面的java.lang.*Error 溢出错误.

当然,一般人不会犯这么低级的错误.
下面我就拿我的项目遇到的问题来说一下.
我的问题是由于在某个类中与另一个类有一对多关系.导致陷入了死循环.
代码如下:

一对多类:User.java(一个User对应多个letter)
public class User {	
	private List<Letter> lettersForFromId;
	private List<Letter> lettersForToId;
	public User() {}
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "userByFromId")
	public List<Letter> getLettersForFromId() {
		return this.lettersForFromId;
	}
	public void setLettersForFromId(List<Letter> lettersForFromId) {
		this.lettersForFromId = lettersForFromId;
	}
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "userByToId")
	public List<Letter> getLettersForToId() {
		return this.lettersForToId;
	}
	public void setLettersForToId(List<Letter> lettersForToId) {
		this.lettersForToId = lettersForToId;
	}
}

多对一类:Letter.java
public class Letter extends IdEntity {

	private static final long serialVersionUID = -2305610965537901463L;
	private User userByToId;
	private User userByFromId;
	public Letter() {
	}
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "to_id", nullable = false)
	public User getUserByToId() {
		return this.userByToId;
	}

	public void setUserByToId(User userByToId) {
		this.userByToId = userByToId;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "from_id", nullable = false)
	public User getUserByFromId() {
		return this.userByFromId;
	}

	public void setUserByFromId(User userByFromId) {
		this.userByFromId = userByFromId;
	}

看到上面例子,仔细对比一下,不难发现. 导致我的User与Letter无限递归,导致陷入死循环,导致栈溢出.
解决方法:
在Letter中所有调用User处加上@JsonIgnore,如:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "to_id", nullable = false)
@JsonIgnore
public User getUserByToId() {
	return this.userByToId;
}



Ps:因为我在数据库中请求是以json格式的. 
@JsonIgnore的意思是不再向下便利.
到此,问题解决了. 
这里主要是记录一下学习笔记,希望能顺便帮助一下遇到相同问题的朋友. 
具体问题还是要具体分析.