Remove APIs deprecated for removal in 6.2

This commit removes the following obsolete and deprecated APIs.

- org.springframework.util.Base64Utils

- org.springframework.cache.jcache.interceptor.JCacheOperationSourcePointcut

- org.springframework.http.client.AbstractClientHttpResponse

- org.springframework.http.client.ClientHttpResponse.getRawStatusCode()

- org.springframework.http.client.observation.ClientHttpObservationDocumentation.HighCardinalityKeyNames.CLIENT_NAME

- org.springframework.web.reactive.function.client.ClientHttpObservationDocumentation.HighCardinalityKeyNames.CLIENT_NAME

- org.springframework.web.filter.reactive.ServerWebExchangeContextFilter.get(Context)

- org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleBindException(...)

- org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleBindException(...)

Closes gh-30608
This commit is contained in:
Sam Brannen 2024-02-16 15:46:37 +01:00
parent 6d5bf6d9b3
commit a85bf3185e
12 changed files with 4 additions and 371 deletions

View File

@ -1,68 +0,0 @@
/*
* Copyright 2002-2023 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.cache.jcache.interceptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
/**
* A Pointcut that matches if the underlying {@link JCacheOperationSource}
* has an operation for a given method.
*
* @author Stephane Nicoll
* @since 4.1
* @deprecated since 6.0.10, as it is not used by the framework anymore
*/
@Deprecated(since = "6.0.10", forRemoval = true)
@SuppressWarnings("serial")
public abstract class JCacheOperationSourcePointcut extends StaticMethodMatcherPointcut implements Serializable {
@Override
public boolean matches(Method method, Class<?> targetClass) {
JCacheOperationSource cas = getCacheOperationSource();
return (cas != null && cas.getCacheOperation(method, targetClass) != null);
}
/**
* Obtain the underlying {@link JCacheOperationSource} (may be {@code null}).
* To be implemented by subclasses.
*/
@Nullable
protected abstract JCacheOperationSource getCacheOperationSource();
@Override
public boolean equals(@Nullable Object other) {
return (this == other || (other instanceof JCacheOperationSourcePointcut that &&
ObjectUtils.nullSafeEquals(getCacheOperationSource(), that.getCacheOperationSource())));
}
@Override
public int hashCode() {
return JCacheOperationSourcePointcut.class.hashCode();
}
@Override
public String toString() {
return getClass().getName() + ": " + getCacheOperationSource();
}
}

View File

@ -1,132 +0,0 @@
/*
* Copyright 2002-2023 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.util;
import java.util.Base64;
/**
* A simple utility class for Base64 encoding and decoding.
*
* <p>Adapts to Java 8's {@link java.util.Base64} in a convenience fashion.
*
* @author Juergen Hoeller
* @author Gary Russell
* @since 4.1
* @see java.util.Base64
* @deprecated as of Spring Framework 6.0.5 in favor of {@link Base64}; scheduled
* for removal in 6.2
*/
@Deprecated(since = "6.0.5", forRemoval = true)
public abstract class Base64Utils {
/**
* Base64-encode the given byte array.
* @param src the original byte array
* @return the encoded byte array
*/
public static byte[] encode(byte[] src) {
if (src.length == 0) {
return src;
}
return Base64.getEncoder().encode(src);
}
/**
* Base64-decode the given byte array.
* @param src the encoded byte array
* @return the original byte array
*/
public static byte[] decode(byte[] src) {
if (src.length == 0) {
return src;
}
return Base64.getDecoder().decode(src);
}
/**
* Base64-encode the given byte array using the RFC 4648
* "URL and Filename Safe Alphabet".
* @param src the original byte array
* @return the encoded byte array
* @since 4.2.4
*/
public static byte[] encodeUrlSafe(byte[] src) {
if (src.length == 0) {
return src;
}
return Base64.getUrlEncoder().encode(src);
}
/**
* Base64-decode the given byte array using the RFC 4648
* "URL and Filename Safe Alphabet".
* @param src the encoded byte array
* @return the original byte array
* @since 4.2.4
*/
public static byte[] decodeUrlSafe(byte[] src) {
if (src.length == 0) {
return src;
}
return Base64.getUrlDecoder().decode(src);
}
/**
* Base64-encode the given byte array to a String.
* @param src the original byte array
* @return the encoded byte array as a UTF-8 String
*/
public static String encodeToString(byte[] src) {
if (src.length == 0) {
return "";
}
return Base64.getEncoder().encodeToString(src);
}
/**
* Base64-decode the given byte array from a UTF-8 String.
* @param src the encoded UTF-8 String
* @return the original byte array
*/
public static byte[] decodeFromString(String src) {
if (src.isEmpty()) {
return new byte[0];
}
return Base64.getDecoder().decode(src);
}
/**
* Base64-encode the given byte array to a String using the RFC 4648
* "URL and Filename Safe Alphabet".
* @param src the original byte array
* @return the encoded byte array as a UTF-8 String
*/
public static String encodeToUrlSafeString(byte[] src) {
return Base64.getUrlEncoder().encodeToString(src);
}
/**
* Base64-decode the given byte array from a UTF-8 String using the RFC 4648
* "URL and Filename Safe Alphabet".
* @param src the encoded UTF-8 String
* @return the original byte array
*/
public static byte[] decodeFromUrlSafeString(String src) {
return Base64.getUrlDecoder().decode(src);
}
}

View File

@ -1,39 +0,0 @@
/*
* Copyright 2002-2023 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.http.client;
import java.io.IOException;
import org.springframework.http.HttpStatusCode;
/**
* Abstract base for {@link ClientHttpResponse}.
*
* @author Arjen Poutsma
* @since 3.1.1
* @deprecated as of 6.0, with no direct replacement; scheduled for removal in 6.2
*/
@Deprecated(since = "6.0", forRemoval = true)
public abstract class AbstractClientHttpResponse implements ClientHttpResponse {
@Override
@SuppressWarnings("removal")
public HttpStatusCode getStatusCode() throws IOException {
return HttpStatusCode.valueOf(getRawStatusCode());
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2024 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.
@ -42,20 +42,6 @@ public interface ClientHttpResponse extends HttpInputMessage, Closeable {
*/
HttpStatusCode getStatusCode() throws IOException;
/**
* Get the HTTP status code as an integer.
* @return the HTTP status as an integer value
* @throws IOException in case of I/O errors
* @since 3.1.1
* @see #getStatusCode()
* @deprecated as of 6.0, in favor of {@link #getStatusCode()}; scheduled for
* removal in 6.2
*/
@Deprecated(since = "6.0", forRemoval = true)
default int getRawStatusCode() throws IOException {
return getStatusCode().value();
}
/**
* Get the HTTP status text of the response.
* @return the HTTP status text

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2024 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.
@ -135,20 +135,6 @@ public enum ClientHttpObservationDocumentation implements ObservationDocumentati
public String asString() {
return "http.url";
}
},
/**
* Client name derived from the request URI host.
* @deprecated in favor of {@link LowCardinalityKeyNames#CLIENT_NAME};
* scheduled for removal in 6.2. This will be available both as a low and
* high cardinality key value.
*/
@Deprecated(since = "6.0.5", forRemoval = true)
CLIENT_NAME {
@Override
public String asString() {
return "client.name";
}
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2024 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.
@ -64,19 +64,4 @@ public class ServerWebExchangeContextFilter implements WebFilter {
return contextView.getOrEmpty(EXCHANGE_CONTEXT_ATTRIBUTE);
}
/**
* Access the {@link ServerWebExchange} from a Reactor {@link Context},
* if available, which is generally the case when
* {@link ServerWebExchangeContextFilter} is present in the filter chain.
* @param context the context to get the exchange from
* @return an {@link Optional} with the exchange if found
* @deprecated in favor of using {@link #getExchange(ContextView)} which
* accepts a {@link ContextView} instead of {@link Context}, reflecting the
* fact that the {@code ContextView} is needed only for reading.
*/
@Deprecated(since = "6.0.6", forRemoval = true)
public static Optional<ServerWebExchange> get(Context context) {
return context.getOrEmpty(EXCHANGE_CONTEXT_ATTRIBUTE);
}
}

View File

@ -768,7 +768,6 @@ class RestTemplateTests {
given(request.execute()).willReturn(response);
given(errorHandler.hasError(response)).willReturn(responseStatus.isError());
given(response.getStatusCode()).willReturn(responseStatus);
given(response.getRawStatusCode()).willReturn(responseStatus.value());
given(response.getStatusText()).willReturn(responseStatus.getReasonPhrase());
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2024 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.
@ -132,20 +132,6 @@ public enum ClientHttpObservationDocumentation implements ObservationDocumentati
public String asString() {
return "http.url";
}
},
/**
* Client name derived from the request URI host.
* @deprecated in favor of {@link LowCardinalityKeyNames#CLIENT_NAME};
* scheduled for removal in 6.2. This will be available both as a low and
* high cardinality key value.
*/
@Deprecated(since = "6.0.5", forRemoval = true)
CLIENT_NAME {
@Override
public String asString() {
return "client.name";
}
}
}

View File

@ -200,9 +200,6 @@ public abstract class ResponseEntityExceptionHandler implements MessageSourceAwa
else if (ex instanceof MethodValidationException subEx) {
return handleMethodValidationException(subEx, headers, HttpStatus.INTERNAL_SERVER_ERROR, request);
}
else if (ex instanceof BindException theEx) {
return handleBindException(theEx, headers, HttpStatus.BAD_REQUEST, request);
}
else {
// Unknown exception, typically a wrapper with a common MVC exception as cause
// (since @ExceptionHandler type declarations also match nested causes):
@ -549,30 +546,6 @@ public abstract class ResponseEntityExceptionHandler implements MessageSourceAwa
return handleExceptionInternal(ex, body, headers, status, request);
}
/**
* Customize the handling of {@link BindException}.
* <p>By default this method creates a {@link ProblemDetail} with the status
* and a short detail message, and then delegates to
* {@link #handleExceptionInternal}.
* @param ex the exception to handle
* @param headers the headers to use for the response
* @param status the status code to use for the response
* @param request the current request
* @return a {@code ResponseEntity} for the response to use, possibly
* {@code null} when the response is already committed
* @deprecated as of 6.0 since {@link org.springframework.web.method.annotation.ModelAttributeMethodProcessor}
* now raises the {@link MethodArgumentNotValidException} subclass instead.
*/
@Nullable
@Deprecated(since = "6.0", forRemoval = true)
protected ResponseEntity<Object> handleBindException(
BindException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
ProblemDetail body = ProblemDetail.forStatusAndDetail(status, "Failed to bind request");
return handleExceptionInternal(ex, body, headers, status, request);
}
/**
* Customize the handling of {@link MethodValidationException}.
* <p>By default this method creates a {@link ProblemDetail} with the status

View File

@ -31,8 +31,6 @@ import org.springframework.http.ProblemDetail;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.lang.Nullable;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.method.MethodValidationException;
import org.springframework.web.ErrorResponse;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
@ -42,7 +40,6 @@ import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingPathVariableException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
@ -240,9 +237,6 @@ public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionRes
else if (ex instanceof MethodValidationException theEx) {
return handleMethodValidationException(theEx, request, response, handler);
}
else if (ex instanceof BindException theEx) {
return handleBindException(theEx, request, response, handler);
}
}
catch (Exception handlerEx) {
if (logger.isWarnEnabled()) {
@ -640,27 +634,6 @@ public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionRes
return new ModelAndView();
}
/**
* Handle the case where an {@linkplain ModelAttribute @ModelAttribute} method
* argument has binding or validation errors and is not followed by another
* method argument of type {@link BindingResult}.
* <p>By default, an HTTP 400 error is sent back to the client.
* @param request current HTTP request
* @param response current HTTP response
* @param handler the executed handler
* @return an empty {@code ModelAndView} indicating the exception was handled
* @throws IOException potentially thrown from {@link HttpServletResponse#sendError}
* @deprecated as of 6.0 since {@link org.springframework.web.method.annotation.ModelAttributeMethodProcessor}
* now raises the {@link MethodArgumentNotValidException} subclass instead.
*/
@Deprecated(since = "6.0", forRemoval = true)
protected ModelAndView handleBindException(BindException ex, HttpServletRequest request,
HttpServletResponse response, @Nullable Object handler) throws IOException {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return new ModelAndView();
}
/**
* Invoked to send a server error. Sets the status to 500 and also sets the
* request attribute "jakarta.servlet.error.exception" to the Exception.

View File

@ -41,7 +41,6 @@ import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindException;
import org.springframework.validation.MapBindingResult;
import org.springframework.validation.method.MethodValidationException;
import org.springframework.validation.method.MethodValidationResult;
@ -292,11 +291,6 @@ class ResponseEntityExceptionHandlerTests {
testException(new MissingServletRequestPartException("partName"));
}
@Test
void bindException() {
testException(new BindException(new Object(), "name"));
}
@Test
void noHandlerFoundException() {
HttpHeaders requestHeaders = new HttpHeaders();

View File

@ -36,7 +36,6 @@ import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.lang.Nullable;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.BindException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
@ -196,15 +195,6 @@ class DefaultHandlerExceptionResolverTests {
assertThat(response.getErrorMessage()).contains("not present");
}
@Test
void handleBindException() {
BindException ex = new BindException(new Object(), "name");
ModelAndView mav = exceptionResolver.resolveException(request, response, null, ex);
assertThat(mav).as("No ModelAndView returned").isNotNull();
assertThat(mav.isEmpty()).as("No Empty ModelAndView returned").isTrue();
assertThat(response.getStatus()).as("Invalid status code").isEqualTo(400);
}
@Test
void handleNoHandlerFoundException() {
ServletServerHttpRequest req = new ServletServerHttpRequest(