본문 바로가기
프로젝트 기록/에러

[Spring / Error] HttpMediaTypeNotAcceptableException: No acceptable representation

by clean01 2024. 6. 22.
org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation

게시판 프로젝트를 만들면서, 글을 조회했을 때 해당 아이디의 글이 없으면 적절한 에러코드와 에러메시지를 내려주는 부분의 코드를 작성하고 테스트하던 중, 위와 같은 예외가 발생하면서 에러 메시지가 제대로 내려오지 않았습니다.

 

 

PostService.java 중 코드 일부

  public Page<PostDto> findAllPostsNotDeleted(Pageable pageable) {
    return postRepository.findByDelYn(false, pageable).map(PostDto::new);
  }
  public PostDto findPostById(Long postId) {

    Post post = postRepository.findById(postId)
        .orElseThrow(() -> new BaseException(ResponseCode.NO_POST, HttpStatus.NOT_FOUND));

    return new PostDto(post.getPostId(),
        post.getTitle(),
        post.getContents(),
        post.getThumbnailImageUrl(),
        post.getMember().getMemberId());
  }

위처럼 리포지토리에서 조회한 Optional 객체가 비어있으면 orElseThrow로 BaseException을 던지고

 

 

ExceptionControllerAdvice.java 코드 중 일부

  @ExceptionHandler(BaseException.class)
  protected ResponseEntity<BaseResponse> handleBaseException(BaseException e) {
    BaseResponse baseResponse = BaseResponse.builder()
        .code(e.getResponseCode().getCode())
        .message(e.getMessage())
        .build();

    return new ResponseEntity<>(baseResponse, e.getHttpStatus());
  }

controlleradvice에서 이렇게 BaseException을 잡아주었는데, 이 부분이 제대로 동작하지 않은 것입니다.

 

 

원인은 BaseResponse 클래스에 getter를 열어주지 않아서 였습니다.
Jackson 라이브러리에서 ResponseEntity 객체를 Json 형식으로 내려줄 때 BaseResponse 인스턴스에 접근해서 값을 가져오는 것 같은데 그때 getter가 필요합니다. (여담으로 부트캠프 수업시간에 배웠던 내용인데 개발하면서 실제로 이슈를 만나니까 반가웠습니다..ㅎㅎ)

BaseResponse의 Getter를 열어주면 제대로 동작하는 것을 확인할 수 있습니다.

Reference