쌓고 쌓다

No HttpMessageConverter for java.util.HashMap and content type "application/x-www-form-urlencoded" 본문

프로그래밍/spring

No HttpMessageConverter for java.util.HashMap and content type "application/x-www-form-urlencoded"

승민아 2023. 9. 1. 17:36

서버에서 외부 api를 사용할 일이 있어서 restTemplate라는걸 사용해보는데... 아래의 에러가 발생.!

문제의 코드

RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

Map<String, String> map = new HashMap<>();
map.put("grant_type", grantType);
map.put("client_id", clientId);
map.put("redirect_uri", redirectUri);
map.put("code", ingaCode);

HttpEntity<Map> request = new HttpEntity<>(map, httpHeaders);
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(uri, request, String.class);

 

에러 발생

org.springframework.web.client.RestClientException:
No HttpMessageConverter for java.util.HashMap and content type "application/x-www-form-urlencoded"

 

HTTP 메시지 컨버터?

https://non-stop.tistory.com/548

간단히 HTTP Message Body에 읽거나 쓸떄 HTTP Message Converter가 동작한다.

메시지 컨버터는 대상 클래스 타입과 미디어 타입을 체크하여 결정한다.

 

에러 원인

RestTemplate.java:1095

내가 요청한 컨텐츠 타입은 HashMap이였고

적절한 메시지 컨버터가 없어 선택되지 않아서 위의 Exception이 터졌다.

 

 

즉, application/x-www-form-urlencoded 미디어 타입의 경우

HashMap으로 변환할 수 없어서 예외가 터진것이다.

 

에러 해결 방법

MultiValueMap의 경우 

 

MultiValueMap으로 변경

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("grant_type", grantType);
map.add("client_id", clientId);
map.add("redirect_uri", redirectUri);
map.add("code", ingaCode);

MultiValueMap<String, String> = new LinkedMultiValueMap<>() 사용시

Map과 동일하게 .put("1","A")를 사용했더니 Value 타입이 List가 아니라 에러가 떴다.

이때 .add 메서드를 사용하면 .add("1","A")로 삽입이 가능하다.

 

put과 add의 차이가 뭘까?

add는 중복된 key가 있는 경우에 해당 Key의 Value인 List에 삽입이된다.

put은 해당 Key의 Value를 List로 대체(갱신)해버린다.

Comments