2017-01-09 121 views
0

我正在编写JUnit测试,通过RestTemplate调用我的应用程序。我已经成功实现了GET,POST和PUT,但无法获得PATCH来运行(尽管它在客户端通过URL发送时起作用)。一个帖子,例如,运行这段代码:如何实现通过RestTemplate执行的PATCH?

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); 

其中编译,但给我一个错误:

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

I:

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

在应用中,我已经在控制器类中定义的操作在'try'块内的return语句上放置一个断点,但是当我在调试下运行它时,它从不跳闸。

谁能告诉我我绊倒了哪里?

+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客户端,如HttpComponentsClientHttpRequestFactoryOkHttpClientHttpRequestFactory

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),如果你想用打补丁方法(@PatchMapping)是有用的,试试这个:

restTemplate.patchForObject("http://localhost:8080/products/batchUpdateProductPositions", requestEntity, String.class);