본문 바로가기

Programming Language/Java & Scala

Resttemplate으로 PATCH 사용시 에러나는 경우 해결방법 - Invalid HTTP method: PATCH; nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH

Spring boot 내에서 Resttemplate를 사용하여 타 url을 호출하는 경우가 있다. 사용하던 도중 아래와 같은 오류가 날 때가 있다.

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
URI uri = new URI(Api.patchJob(host));
String active = "{\"active\":true}";
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>(active, headers);
ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.PATCH, entity, String.class);
HttpStatus resultStatus = response.getStatusCode();
//오류메시지..
org.springframework.web.client.ResourceAccessException: I/O error on PATCH 
request for "http://localhost:8081/api/jobs": Invalid HTTP method: PATCH; 
nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH

	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:744)
	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:710)
	at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:598)
    ...

상기에러는 Resttemplate이 http method 중 하나인 PATCH를 사용하여 호출하지 못해서 생기는 오류이다.
이 때 아래와 같이 수행하면 해결 가능하다.

단계1 : library 추가

apache의 httpcomponents의 httpclient 추가

dependencies {
...
    compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.6'
...
}

단계2 : 코드 변경

RestTemplate 객체 생성시 apache HttpClientFactory 주입하여 생성

RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
HttpHeaders headers = new HttpHeaders();
URI uri = new URI(Api.patchJob(host));
String active = "{\"active\":true}";
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>(active, headers);
ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.PATCH, entity, String.class);
HttpStatus resultStatus = response.getStatusCode();

이후 완벽하게 오류가 해결된 것을 볼 수 있다. Resttemplate의 PUT method의 오류에도 동일하게 해결 가능