【问题标题】:Resttemplate and patch, invalidResttemplate和patch,无效
【发布时间】:2016-12-28 19:48:46
【问题描述】:

我用的是spring 1.4.3

我尝试调用网络服务

  @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 at 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]

【问题讨论】:

    标签: spring-boot resttemplate spring-restcontroller


    【解决方案1】:

    以 ritesh.garg 的回答为基础:

    将以下 dependency 添加到您的类路径:

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.6</version>
    </dependency>
    

    然后,像这样创建您的RestTemplate

        RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
    

    【讨论】:

      【解决方案2】:

      HttpUrlConnection 不支持 Http 补丁。见this

      解决方法是配置rest模板使用spring的HttpComponentsClientHttpRequestFactory。

      RestTemplateBuilder 公开 requestfactory 设置器,应该使用它来执行此操作。

      【讨论】:

      • 我在 java 6... 2013... 有点老了
      • 是的。那是最近引入补丁的时候。他们决定将其标记为不会修复。话虽如此,Spring 和 apache 确实通过在内部将 Patch 处理为 Put 来提供对 Patch 的支持。为了使用spring,您需要使用spring的客户端http请求工厂(就像我在回答中提到的那样)