본문 바로가기
개발 관련 학습 및 문제해결

자바 스프링 부트 컨트롤러 406 Not Acceptable 에러[20221104-TIL]

by 날파리1 2022. 11. 4.
.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 에러

 

HTTP (HyperText Transfer Protocol) 406 Not Acceptable 클라이언트 오류 응답 코드는 서버가 요청의 사전 콘텐츠 협상 헤더에 정의 된 허용 가능한 값 목록과 일치하는 응답을 생성 할 수 없으며 서버가 기본 표현을 제공하지 않음을 나타낸다고 한다.

 

즉 헤더랑 일치하는 값이 없다는 건데...

 

에러 내용 찾아봤는데 다들 MappingJackson2HttpMessageConverter 문제라고 한다..

헤더에 원하는 타입으로 변환 못해주고 있는 상황

 

다른 블로그에서는 거의다 Lombok을 사용하고 있기때문에 @Getter 라는 어노테이션을 Dto 클래스 위에 선언해주면 된다고 하는데... 나의 경우는 이런 경우랑 상관이 없다..(테스트 코드이고 이걸로 해결안된던 적이 거의 없어서...) 그렇지만 링크를 보니 지난번에도 이 에러코드를 검색한 흔적이 있길래 한 번 정리를 하고 가자.

 

컨트롤러

@GetMapping("/freeTalks")
@ResponseStatus(HttpStatus.OK)
public FreeTalksDto list(
    @RequestParam(required = false, defaultValue = "1") Integer page
) {

  List<FreeTalkDto> freeTalkDtos =
      freeTalkService.list(page)
          .stream()
          .map(freeTalk -> freeTalk.toDto(freeTalkHashTagService.list(freeTalk.getId())))
          .collect(Collectors.toList());

  int pageNumber = freeTalkService.pages();

  return new FreeTalksDto(freeTalkDtos, pageNumber);
}

컨트롤러에서 다음과 같이 보내주고 있다.

 

하나하나 검사를 해보니...

 

마지막에 리턴해주는 DTO를 생성만 해두고 게터와 필드를 아무것도 안만들어놨었다... 어쩐지...

 

또 받아오는 변수를  아래와 같이 하지 않고 freeTalksDto로 getter를 만드니 jsontype이 api 서버에서 dto라는 이름을 가지고 나와서 프론트 엔드에서 받아오기 적절하지 않다.. 게터 명 맞추는 것도 중요하다!!!!!

노션에 기록해두자

public class FreeTalksDto  {
  private List<FreeTalkDto> freeTalks;
  private int pageNumber;

  public FreeTalksDto(List<FreeTalkDto> freeTalks, int pageNumber) {
    this.freeTalks = freeTalks;
    this.pageNumber = pageNumber;
  }

댓글