2016-12-28 78 views
0

我用弹簧1.4.3Resttemplate和补丁,无效

我尝试调用Web服务

@PatchMapping(value = "/members/{memberId}/card") 
    public ResponseEntity updateMemberCardId(@PathVariable("memberId") Long memberId, @RequestBody String cardId) throws ResourceNotFoundException { 
     memberService.updateMemberCardId(cardId, memberId); 
     return new ResponseEntity<>(HttpStatus.NO_CONTENT); 
    } 

在我的应用程序,

@Component 
@Configuration 
public class ClientRestConfig { 

    @Bean 
    public RestTemplate restTemplate(RestTemplateBuilder builder, @Value("${main.server.url}") String mainServerUrl, @Value("${commerce.username}") String commerceUsername, @Value("${commerce.password}") String commercePassword, @Value("${connection.timeout}") int timeout) { 
     return builder.setConnectTimeout(timeout).setReadTimeout(timeout).basicAuthorization(commerceUsername, commercePassword).rootUri(mainServerUrl).build(); 
    } 

} 

在另一种方法我做

String cardId = "123456789"; 

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 
HttpEntity<String> entity = new HttpEntity<>(cardId, headers); 

ResponseEntity responseEntity = restTemplate.patchForObject("/rest/members/1/card", entity, ResponseEntity.class); 

我得到这个错误

java.net.ProtocolException:无效HTTP方法:在PATCH java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:440) 〜[NA:1.8.0_111]在 sun.net.www。 protocol.http.HttpURLConnection.setRequestMethod(HttpURLConnection.java:552) 〜[NA:1.8.0_111]

回答

0

的Http补丁不受HttpURLConnection的支持。请参阅this

解决此问题的方法是将rest模板配置为使用spring的HttpComponentsClientHttpRequestFactory。

RestTemplateBuilder公开了应该用来做这件事的requestfactory setter。

+0

我在java 6 ... 2013 ...有点旧 –

+0

是的。那是最近推出Patch的时候。他们决定将其标记为“无法修复”。话虽如此,Spring和apache通过内部处理它来提供对Patch的支持。为了使用spring,你需要使用spring的客户端http请求工厂(就像我在我的回答中提到的那样) –