1. 개요

이 빠른 기사에서는 HttpMediaTypeNotAcceptableException 예외를 살펴 보고이 예외가 발생할 수있는 경우를 이해합니다.

2. 문제

Spring과 API 엔드 포인트를 구현할 때, 우리는 일반적으로 소비 / 생산 용지 종류를 지정합니다 (경유 할 필요 가 소비를 하고 생산 매개 변수). 이렇게하면 해당 특정 작업에 대해 API가 클라이언트로 다시 반환하는 가능한 형식이 좁혀집니다.

HTTP에는 또한 클라이언트가 인식하고 받아 들일 수있는 미디어 유형을 지정하는 데 사용되는 전용 "Accept" 헤더가 있습니다. 간단히 말해, 서버는 클라이언트가 요청한 미디어 유형 중 하나를 사용하여 리소스 표현을 다시 보냅니다.

그러나 양측이 함께 작동 할 수있는 공통 유형이 없으면 Spring은 HttpMediaTypeNotAcceptableException 예외를 발생시킵니다.

3. 실제 사례

이 시나리오를 보여주는 간단한 예제를 만들어 보겠습니다.

"application / json " 에서만 작동하고 JSON 데이터도 반환 하는 POST 엔드 포인트를 사용할 것입니다.

@PostMapping(
  value = "/test", 
  consumes = MediaType.APPLICATION_JSON_VALUE, 
  produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, String> example() {
    return Collections.singletonMap("key", "value");
}

그런 다음 인식 할 수없는 콘텐츠 유형으로 CURL을 사용하여 요청을 보냅니다.

curl -X POST --header "Accept: application/pdf" http://localhost:8080/test -v

> POST /test HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.51.0
> Accept: application/pdf

우리가받은 응답은 다음과 같습니다.

< HTTP/1.1 406 
< Content-Length: 0

4. 해결책

문제를 해결하는 유일한 방법은 지원되는 유형 중 하나를 보내거나받는 것입니다.

우리가 할 수있는 모든 것은 허용 가능한 모든 미디어 유형에 대해 클라이언트에게 알리는 사용자 정의 ExceptionHandler 와 함께보다 설명적인 메시지 (기본적으로 Spring이 빈 본문을 반환 함)를 제공하는 것 입니다.

우리의 경우에는 "application / json" 뿐입니다 .

@ResponseBody
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public String handleHttpMediaTypeNotAcceptableException() {
    return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE;
}

5. 결론

이 예제에서 우리는 클라이언트가 요청하는 것과 서버가 실제로 생성 할 수있는 것 사이에 불일치가있을 때 Spring MVC에서 던지는 HttpMediaTypeNotAcceptableException 예외를 고려했습니다 .

항상 그렇듯이 기사에 언급 된 코드 스 니펫은 GitHub 저장소 에서 찾을 수 있습니다 .