쌓고 쌓다

Cannot handle managed/back reference 'defaultReference': back reference type ... not compatible with managed type ... 본문

프로그래밍/spring

Cannot handle managed/back reference 'defaultReference': back reference type ... not compatible with managed type ...

승민아 2023. 10. 1. 20:38

먼저 Comment, Poster, UploadFile 엔티티를 보자.

Comment

@Entity
@Data
public class Comment {
    ...
    @ManyToOne
    @JoinColumn(name="poster_id")
    private Poster poster;
}

 

Poster

@Entity
@Getter
@Setter
@ToString
public class Poster {
    ...
    
    @ManyToOne
    @JoinColumn(name="writer")
    private Member writer;
    
    @JsonBackReference
    @OneToMany(mappedBy = "poster", cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
    private List<UploadFile> imgFiles = new ArrayList<>();
}

 

UploadFile

@Entity
@NoArgsConstructor
@Getter
@Setter
public class UploadFile {
    ...
    @ManyToOne
    @JoinColumn(name="pno")
    @JsonManagedReference
    private Poster poster;   
}

 

이런 엔티티 상황에서 댓글에 관한 PostMapping을 수행해봤다.

@PostMapping(value = "/comment/write", consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String commentWrite(@RequestBody Comment comment, @RequestParam Long pno) {
    System.out.println("comment = " + comment);
    System.out.println("pno = " + pno);
    //commentService.write(comment);
    return "ok";
}

JSON 데이터를 POST 요청으로 전송했더니 아래의 에러가 발생했다.

 

에러 발생

"Unsupported Media Type" 그리고...

1. Failed to evaluate Jackson deserialization for type [[simple type, class com.example.board.domain.Comment]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference 'defaultReference': back reference type (`java.util.List<com.example.board.domain.UploadFile>`) not compatible with managed type (com.example.board.domain.UploadFile)

2. Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/json;charset=UTF-8' is not supported]

 

2번 에러를 보면 처리할 수 없는 데이터라고 하는데

consumes = MediaType.APPLICATION_JSON_VALUE로 처리할 데이터도 지정해줬는데 왜...

 

1번 에러를 보면

난 Comment에 대한 처리만하고 있는데 왜 뜬금없이 UploadFile이 문제가 될까..

 

이상하게 String 타입으로는 잘 받아와진다..

 

JSON을 Comment 클래스로 변환하는데 문제가 있나보다.

에러 내용 또한 Failed to evaluate Jackson deserialization for type로

JSON을 객체로 만드는 역직렬화 과정에서 문제가 있음을 알리고있다.

 

그렇다 뜬금없이 UploadFile이 문제가 된다고하는것은

Comment의 Poster와 Poster안의 List<UploadFIle>부분에서

@JsonManagedReference와 @JsonBackReference가 문제가 된것이다.

 

@JsonManagedReference를 연관관계 주인 반대 Entity에..

@JsonBackReference를 연관관계 주인 Entity에... 적용했어야했다.

내가 엉망으로 적용하니 에러가 발생한 것이다.

 

올바르게 적용하자..

public class UploadFile {

    @ManyToOne
    @JoinColumn(name="pno")
    @JsonBackReference // 수정된 부분
    private Poster poster;
}
public class Poster {

    @JsonManagedReference // 수정된 부분
    @OneToMany(mappedBy = "poster", cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
    private List<UploadFile> imgFiles = new ArrayList<>();

}

 

https://stackoverflow.com/questions/44713849/can-not-handle-managed-back-reference-defaultreference-back-reference-type-j

Comments