2017-01-09 5 views
0

Я кодирую тесты JUnit, вызывая мое приложение через RestTemplate. Я успешно реализовал GET, POST и PUT, но не могу запустить PATCH (хотя он работает, когда клиент отправляет URL-адрес). Столбу, к примеру, работает с этим кодом:Как реализовать PATCH, выполненный с помощью RestTemplate?

RestTemplate restTemplate = new RestTemplate(); 
    ProductModel postModel = restTemplate.postForObject(TestBase.URL + URL, pModel, ProductModel.class);    

, но когда я попытался вызвать restTemplate.patchForObject() - который я нашел в Интернете - STS возвращает ошибку о том, что функция не определена. Таким образом, я использовал это:

RestTemplate restTemplate = new RestTemplate(); 
    ResponseEntity<MessageModel> retval = restTemplate.exchange("http://localhost:8080/products/batchUpdateProductPositions", 
      HttpMethod.PATCH, new HttpEntity<ProductPositionListModel>(pps), MessageModel.class); 

который компилирует, но дает мне ошибку:

I/O Error on PATCH request for "http://localhost:8080/products/batchUpdateProductPositions": Invalid HTTP method: PATCH 

В приложении я операция, определенная в классе контроллера:

@RequestMapping(value = "/batchUpdateProductPositions", method = RequestMethod.PATCH) 
public MessageModel batchUpdatePosition(
     @RequestBody ProductPositionListModel productPositionList) 
     throws Exception { 
    try { 
     return productService.batchUpdatePosition(productPositionList); 
    } catch (Exception e) { 

I поставьте точку останова на оператор return внутри блока try, но он никогда не срабатывал, когда я запускал его под отладкой.

Может ли кто-нибудь сказать мне, где я споткнулся?

+0

HTTP://stackoverflow.com/questions/29447382/resttemplate-patch-request –

ответ

0

Я обнаружил решение, которое согласуется с остальной частью кода JUnit. Используя postForObject(), вы можете перейти по HTTP-методу в этом случае:

MessageModel pModel = restTemplate.postForObject(TestBase.URL + URL + "/batchUpdateProductPositions?_method=patch", 
      pps, MessageModel.class);   

Это работает правильно. Не могу сказать, есть ли побочные эффекты, о которых я не замечаю.

0

По умолчанию RestTemplate использует стандартный клиент JDK HttpURLConnection HTTP для выполнения запросов. Этот клиент не поддерживает метод PATCH. Вы можете настроить RestTemplate для использования какого-либо другого HTTP-клиента через клиентскую фабрику, например HttpComponentsClientHttpRequestFactory или OkHttpClientHttpRequestFactory.

HttpClient client = HttpClients.createDefault(); 
RestTemplate template= new RestTemplate(); 
template.setRequestFactory(new HttpComponentsClientHttpRequestFactory(client)); 

Вам также необходимо добавить соответствующую зависимость, что-то вроде org.apache.httpcomponents:httpclient:$version в случае HTTP компонентов клиента.

0

Это решение

MessageModel pModel = restTemplate.postForObject(TestBase.URL + URL + "/batchUpdateProductPositions?_method=patch",pps, MessageModel.class); 

Полезно, если вы используете Post метод (@PostMapping), если вы хотите использовать Patch метод (@PatchMapping), Попробуйте это:

restTemplate.patchForObject("http://localhost:8080/products/batchUpdateProductPositions", requestEntity, String.class); 
Смежные вопросы