Skip to content

Commit bb2174c

Browse files
committed
Merge branch '6.2.x'
2 parents e73dc37 + 9ab43b1 commit bb2174c

File tree

4 files changed

+43
-7
lines changed

4 files changed

+43
-7
lines changed

spring-web/src/main/java/org/springframework/web/method/annotation/HandlerMethodValidationException.java

+21-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -147,7 +147,12 @@ public void visitResults(Visitor visitor) {
147147
}
148148
RequestBody requestBody = param.getParameterAnnotation(RequestBody.class);
149149
if (requestBody != null) {
150-
visitor.requestBody(requestBody, asErrors(result));
150+
if (result instanceof ParameterErrors errors) {
151+
visitor.requestBody(requestBody, errors);
152+
}
153+
else {
154+
visitor.requestBodyValidationResult(requestBody, result);
155+
}
151156
continue;
152157
}
153158
RequestHeader requestHeader = param.getParameterAnnotation(RequestHeader.class);
@@ -217,6 +222,20 @@ public interface Visitor {
217222
*/
218223
void requestBody(RequestBody requestBody, ParameterErrors errors);
219224

225+
/**
226+
* An additional {@code @RequestBody} callback for validation failures
227+
* for constraints on the method parameter. For example:
228+
* <pre>
229+
* &#064;RequestBody List<&#064;NotEmpty String> ids
230+
* </pre>
231+
* Handle results for {@code @RequestBody} method parameters.
232+
* @param requestBody the annotation declared on the parameter
233+
* @param result the validation result
234+
* @since 7.0
235+
*/
236+
default void requestBodyValidationResult(RequestBody requestBody, ParameterValidationResult result) {
237+
}
238+
220239
/**
221240
* Handle results for {@code @RequestHeader} method parameters.
222241
* @param requestHeader the annotation declared on the parameter

spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.apache.commons.logging.Log;
2424
import org.apache.commons.logging.LogFactory;
25+
import org.jspecify.annotations.Nullable;
2526

2627
import org.springframework.core.NestedExceptionUtils;
2728
import org.springframework.util.Assert;
@@ -100,7 +101,11 @@ else if (logger.isDebugEnabled()) {
100101
* <li>IOException "Broken pipe" or "connection reset by peer"
101102
* </ul>
102103
*/
103-
public static boolean isClientDisconnectedException(Throwable ex) {
104+
public static boolean isClientDisconnectedException(@Nullable Throwable ex) {
105+
if (ex == null) {
106+
return false;
107+
}
108+
104109
Throwable currentEx = ex;
105110
Throwable lastEx = null;
106111
while (currentEx != null && currentEx != lastEx) {

spring-web/src/test/java/org/springframework/web/method/support/HandlerMethodValidationExceptionTests.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
2525
import java.util.function.Predicate;
2626

2727
import jakarta.validation.Valid;
28+
import jakarta.validation.constraints.NotEmpty;
2829
import jakarta.validation.constraints.Size;
2930
import org.jspecify.annotations.Nullable;
3031
import org.junit.jupiter.api.Test;
@@ -67,7 +68,7 @@ class HandlerMethodValidationExceptionTests {
6768

6869

6970
private final HandlerMethod handlerMethod = handlerMethod(new ValidController(),
70-
controller -> controller.handle(person, person, person, person, "", "", "", "", "", ""));
71+
controller -> controller.handle(person, person, person, List.of(), person, "", "", "", "", "", ""));
7172

7273
private final TestVisitor visitor = new TestVisitor();
7374

@@ -84,7 +85,7 @@ void traverse() {
8485

8586
assertThat(this.visitor.getOutput()).isEqualTo("""
8687
@ModelAttribute: modelAttribute1, @ModelAttribute: modelAttribute2, \
87-
@RequestBody: requestBody, @RequestPart: requestPart, \
88+
@RequestBody: requestBody, @RequestBody: requestBodyList, @RequestPart: requestPart, \
8889
@RequestParam: requestParam1, @RequestParam: requestParam2, \
8990
@RequestHeader: header, @PathVariable: pathVariable, \
9091
@CookieValue: cookie, @MatrixVariable: matrixVariable""");
@@ -100,7 +101,7 @@ void traverseRemaining() {
100101

101102
assertThat(this.visitor.getOutput()).isEqualTo("""
102103
Other: modelAttribute1, @ModelAttribute: modelAttribute2, \
103-
@RequestBody: requestBody, @RequestPart: requestPart, \
104+
@RequestBody: requestBody, @RequestBody: requestBodyList, @RequestPart: requestPart, \
104105
Other: requestParam1, @RequestParam: requestParam2, \
105106
@RequestHeader: header, @PathVariable: pathVariable, \
106107
@CookieValue: cookie, @MatrixVariable: matrixVariable""");
@@ -155,6 +156,7 @@ void handle(
155156
@Valid Person modelAttribute1,
156157
@Valid @ModelAttribute Person modelAttribute2,
157158
@Valid @RequestBody Person requestBody,
159+
@RequestBody List<@NotEmpty String> requestBodyList,
158160
@Valid @RequestPart Person requestPart,
159161
@Size(min = 5) String requestParam1,
160162
@Size(min = 5) @RequestParam String requestParam2,
@@ -222,6 +224,11 @@ public void requestBody(RequestBody requestBody, ParameterErrors errors) {
222224
handle(requestBody, errors);
223225
}
224226

227+
@Override
228+
public void requestBodyValidationResult(RequestBody requestBody, ParameterValidationResult result) {
229+
handle(requestBody, result);
230+
}
231+
225232
@Override
226233
public void requestHeader(RequestHeader requestHeader, ParameterValidationResult result) {
227234
handle(requestHeader, result);

spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java

+5
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,9 @@ void onwardClientDisconnectedExceptionType() {
9090
assertThat(DisconnectedClientHelper.isClientDisconnectedException(ex)).isFalse();
9191
}
9292

93+
@Test // gh-34533
94+
void nullException() {
95+
assertThat(DisconnectedClientHelper.isClientDisconnectedException(null)).isFalse();
96+
}
97+
9398
}

0 commit comments

Comments
 (0)