작성
·
1.4K
0
안녕하세요 선생님, 수업 잘 듣고있습니다.
POST 방식으로 http://localhost:8088/jpa/users/9001/posts를 Request했을 때 500 Internal Server Error가 나오는데, 어떻게 해결해야할 지 모르겠습니다ㅠㅠ
[Postman]
[UserJpaController.java]
@PostMapping ("/users/{id}/posts")
public ResponseEntity<Post> createPost(@PathVariable int id, @RequestBody Post post){
Optional<User> user = userRepository.findById(id);
if (!user.isPresent()) {
throw new UserNotFoundException(String.format("ID{%s} not found",id));
}
//Post의 User를 방금 조회한 User정보로 설정
post.setUser(user.get());
// logger.info(String.valueOf(user.get()));
Post savedPost = postRepository.save(post);
//id 값을 자동으로 지정
URI location =ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedPost.getId())
.toUri();
return ResponseEntity.created(location).build();
}
[Debugging시 에러 메세지]
UserJpaController.java 파일에서 post.setUser(user.get());에서 발생
[Post.java]
public class Post {
@Id
@GeneratedValue
private Integer id;
private String description;
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
private User user;
}
[User.java]
@OneToMany(mappedBy = "user")
private List<Post> posts;
public User(int id, String name, Date joinDate, String password, String ssn) {
this.id = id;
this.name = name;
this.joinDate = joinDate;
this.password = password;
this.ssn = ssn;
}
답변 1
0
안녕하세요, 이도원입니다.
올려주는 오류는 디버그 시 나왔던 메시지하고는 다른 원인인것 같습니다.
디버그 시 보여지는 "Method threw 'java.lang.StackOverflowError" 오류는 Optional 데이터를 사용했기 때문에 보여지는 오류인데, 실제 에러라기 보다는 디버깅 모드에서만 보여지는 현상입니다. 물론 Optional 객체에서 데이터가 존재하지 않는 null 상태일 수도 있겠지만, 그건 바로 위 코드인 isPresent() 메소드에서 확인하고 있기 때문에, user.get()을 사용하는 부분에서는 null 데이터는 아닙니다.
IntelliJ에서 디보깅 시 위와 같은 메시지를 보지 않으시려면, 디버깅 창에서 해당 부분을 선택하시고, 마우스 우측버튼을 클릭하신다음, View as > Object로 선택하시면, 됩니다.
위에 말씀드린 것 처럼, 디버그 모드에 보여주는 에러 메시지 외에 다른 오류가 있을 것 같습니다. 콘솔화면에 출력된 메시지를 다시 한번 공유해 주시면, 오류 원인을 찾아보도록 하겠습니다.
감사합니다.