2016-12-28 79 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請求工廠(就像我在我的回答中提到的那樣) –