개발 관련 학습 및 문제해결
자바 스프링 부트 컨트롤러 406 Not Acceptable 에러[20221104-TIL]
날파리1
2022. 11. 4. 21:13
.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;
}