先上代码
这是代码报错的配置
@Configuration
public class RestTemplateConfig {
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
return factory;
}
}
SimpleClientHttpRequestFactory 继承自 ClientHttpRequestFactory,同时继承ClientHttpRequestFactory的有
主要有4个,分别是
- SimpleClientHttpRequestFactory
- OkHttp3ClientHttpRequestFactory
- HttpComponentsClientHttpRequestFactory
- Netty4ClientHttpRequestFactory
我们先看默认的SimpleClientHttpRequestFactory
1、SimpleClientHttpRequestFactory
@Override
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
HttpURLConnection connection = openConnection(uri.toURL(), this.proxy);
prepareConnection(connection, httpMethod.name());
if (this.bufferRequestBody) {
return new SimpleBufferingClientHttpRequest(connection, this.outputStreaming);
}
else {
return new SimpleStreamingClientHttpRequest(connection, this.chunkSize, this.outputStreaming);
}
}
这里用到的是 HttpURLConnection,点进去看
可以看到支持的请求类型,根本就没有patch,说明这个HttpURLConnection是不支持patch请求,代码里边也有如下判断,就是非常简单粗暴循环这个支持的请求类型数组,不在这个数组中的请求一律抛出异常
也就是说默认的restTemplate是不支持patch请求的。
找到问题所在了,那应该怎么去解决问题呢。更换对应的工厂类,并添加对应的jar包就可以了
解决方案一:
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
OkHttp3ClientHttpRequestFactory factory = new OkHttp3ClientHttpRequestFactory();
return factory;
}
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
解决方案二:
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
return factory;
}
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>