From 048098119efedbea0461539623188ed2af785bb7 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 27 Dec 2016 13:32:43 +0100 Subject: [PATCH] PATCH does not work with the standard JDK HTTP library Issue: SPR-15052 --- .../http/client/support/HttpAccessor.java | 28 ++++++++++++------- .../web/client/RestOperations.java | 15 ++++++++++ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/support/HttpAccessor.java b/spring-web/src/main/java/org/springframework/http/client/support/HttpAccessor.java index fa60e171bd2..6904445fab6 100644 --- a/spring-web/src/main/java/org/springframework/http/client/support/HttpAccessor.java +++ b/spring-web/src/main/java/org/springframework/http/client/support/HttpAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,33 +33,39 @@ import org.springframework.util.Assert; * and other HTTP accessing gateway helpers, defining common properties * such as the {@link ClientHttpRequestFactory} to operate on. * - *

Not intended to be used directly. See {@link org.springframework.web.client.RestTemplate}. + *

Not intended to be used directly. + * See {@link org.springframework.web.client.RestTemplate}. * * @author Arjen Poutsma + * @author Juergen Hoeller * @since 3.0 * @see org.springframework.web.client.RestTemplate */ public abstract class HttpAccessor { - /** - * Logger available to subclasses. - */ + /** Logger available to subclasses */ protected final Log logger = LogFactory.getLog(getClass()); private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); /** - * Set the request factory that this accessor uses for obtaining - * {@link ClientHttpRequest HttpRequests}. + * Set the request factory that this accessor uses for obtaining client request handles. + *

The default is a {@link SimpleClientHttpRequestFactory} based on the JDK's own + * HTTP libraries ({@link java.net.HttpURLConnection}). + *

Note that the standard JDK HTTP library does not support the HTTP PATCH method. + * Configure the Apache HttpComponents or OkHttp request factory to enable PATCH. + * @see #createRequest(URI, HttpMethod) + * @see org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory + * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ public void setRequestFactory(ClientHttpRequestFactory requestFactory) { - Assert.notNull(requestFactory, "'requestFactory' must not be null"); + Assert.notNull(requestFactory, "ClientHttpRequestFactory must not be null"); this.requestFactory = requestFactory; } /** - * Return the request factory that this accessor uses for obtaining {@link ClientHttpRequest HttpRequests}. + * Return the request factory that this accessor uses for obtaining client request handles. */ public ClientHttpRequestFactory getRequestFactory() { return this.requestFactory; @@ -69,9 +75,11 @@ public abstract class HttpAccessor { /** * Create a new {@link ClientHttpRequest} via this template's {@link ClientHttpRequestFactory}. * @param url the URL to connect to - * @param method the HTTP method to exectute (GET, POST, etc.) + * @param method the HTTP method to execute (GET, POST, etc) * @return the created request * @throws IOException in case of I/O errors + * @see #getRequestFactory() + * @see ClientHttpRequestFactory#createRequest(URI, HttpMethod) */ protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException { ClientHttpRequest request = getRequestFactory().createRequest(url, method); diff --git a/spring-web/src/main/java/org/springframework/web/client/RestOperations.java b/spring-web/src/main/java/org/springframework/web/client/RestOperations.java index 86926074051..aed0a89d10a 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestOperations.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestOperations.java @@ -314,6 +314,8 @@ public interface RestOperations { *

URI Template variables are expanded using the given URI variables, if any. *

The {@code request} parameter can be a {@link HttpEntity} in order to * add additional HTTP headers to the request. + *

NOTE: The standard JDK HTTP library does not support HTTP PATCH. + * You need to use the Apache HttpComponents or OkHttp request factory. * @param url the URL * @param request the object to be PATCHed (may be {@code null}) * @param responseType the type of the return value @@ -321,6 +323,9 @@ public interface RestOperations { * @return the converted object * @since 4.3.5 * @see HttpEntity + * @see RestTemplate#setRequestFactory + * @see org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory + * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ T patchForObject(String url, Object request, Class responseType, Object... uriVariables) throws RestClientException; @@ -331,6 +336,8 @@ public interface RestOperations { *

URI Template variables are expanded using the given map. *

The {@code request} parameter can be a {@link HttpEntity} in order to * add additional HTTP headers to the request. + *

NOTE: The standard JDK HTTP library does not support HTTP PATCH. + * You need to use the Apache HttpComponents or OkHttp request factory. * @param url the URL * @param request the object to be PATCHed (may be {@code null}) * @param responseType the type of the return value @@ -338,6 +345,9 @@ public interface RestOperations { * @return the converted object * @since 4.3.5 * @see HttpEntity + * @see RestTemplate#setRequestFactory + * @see org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory + * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ T patchForObject(String url, Object request, Class responseType, Map uriVariables) throws RestClientException; @@ -347,12 +357,17 @@ public interface RestOperations { * and return the representation found in the response. *

The {@code request} parameter can be a {@link HttpEntity} in order to * add additional HTTP headers to the request. + *

NOTE: The standard JDK HTTP library does not support HTTP PATCH. + * You need to use the Apache HttpComponents or OkHttp request factory. * @param url the URL * @param request the object to be PATCHed (may be {@code null}) * @param responseType the type of the return value * @return the converted object * @since 4.3.5 * @see HttpEntity + * @see RestTemplate#setRequestFactory + * @see org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory + * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ T patchForObject(URI url, Object request, Class responseType) throws RestClientException;