StackOverflowError 스택 오버플로우 오류

2882 단어 J2EE
일반 창고가 넘쳐나는 것은 어떤classA에서classA를 호출했기 때문에 사순환에 빠지는 것이다. 
문제의 기본 원리는 다음과 같습니다.
Class A{
  public A(){
     a= new A();
  }
}

 
이게 자바를 만들지 않을 수 있다고.lang.Stack Overflow Error 그렇기 때문에 코드를 쓰는 것을 피하려면 방법체(자신의 Constructer 제외)에 넣거나 Static에 넣어야 합니다. 상기 코드는 JVM의 명령을 사용합니다. 사실은 다음과 같습니다.
0:   aload_0
1:   invokespecial  #1; //Method  java/lang/object .
4:   aload_0 
5:   new  #2; //class A
8:   dup
9:   invokespecial  #3; //Method  java/lang/object .
12: putfield    #4; //Field a:LA;
15: return
 

여기서constructer에서는 init를 호출하고 static는cinit를 호출합니다. 따라서 우리는 자신의 대상을static에 넣으면 순환을 찾을 수 없고, 자신을constructer에 넣으면 init를 끊임없이 호출하기 때문에 위의java가 발생합니다.lang.Stack Overflow Error 오버플로우 오류.
물론 일반인들은 이렇게 저급한 잘못을 저지르지 않을 것이다.
다음은 제 프로젝트에 부딪힌 문제를 말씀드리겠습니다.
나의 문제는 어떤 종류에서 다른 종류와 일대다 관계가 있기 때문이다.사순환에 빠지다.
코드는 다음과 같습니다.
일대다 클래스: User.java
public class User {	
	private List lettersForFromId;
	private List lettersForToId;
	public User() {}
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "userByFromId")
	public List getLettersForFromId() {
		return this.lettersForFromId;
	}
	public void setLettersForFromId(List lettersForFromId) {
		this.lettersForFromId = lettersForFromId;
	}
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "userByToId")
	public List getLettersForToId() {
		return this.lettersForToId;
	}
	public void setLettersForToId(List 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는 더 이상 아래로 편리하지 않다는 뜻입니다.
여기까지, 문제가 해결되었다. 
여기에는 주로 학습 노트를 기록하는데, 같은 문제에 부딪힌 친구를 도울 수 있기를 바랍니다. 
구체적인 문제는 역시 구체적으로 분석해야 한다.

좋은 웹페이지 즐겨찾기