Skip to content

HandlerMethodValidationException.Visitor should support RequestBody with method parameter constraints #34549

@jarzynp

Description

@jarzynp

Environment

Spring Boot: 3.4.3
Spring Web: 6.2.3
Java: 17


Expected Behavior

When a @RequestBody value is invalid, HandlerMethodValidationException.Visitor should call the appropriate method.

Observed Behavior

Instead, HandlerMethodValidationException.Visitor throws IllegalStateException with "Expected ParameterErrors" message.

Example code

@Target({ElementType.TYPE_USE, ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = {}) @NotEmpty @Pattern(regexp = "^[a-z0-9]{1,10}$", message = ResId.RULES) public @interface ResId { String RULES = "Identifier doesn't follow defined rules."; String message() default RULES; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
@RestController @RequestMapping("/api") public class Controller { @PostMapping("/{id}/modify") public ResponseEntity<Object> modify( @PathVariable @ResId final String id, @RequestBody @Valid final List<@ResId String> linkedResourceIds) { return ResponseEntity.noContent(); } }

Example request

HTTP Method = POST Request URI = /api/foo/modify Body = ["aasfw44t23gsdge4g3wcsdf43"] 

Insights

In HandlerMethodValidationException#visitResults(HandlerMethodValidationException.Visitor):

RequestBody requestBody = param.getParameterAnnotation(RequestBody.class); if (requestBody != null) { visitor.requestBody(requestBody, asErrors(result)); continue; }

the condition if (requestBody != null) is true, but the asErrors(result) is throwing the exception because in this case result is not an instance of ParameterErrors but ParameterValidationResult.

Image

Metadata

Metadata

Assignees

Labels

in: webIssues in web modules (web, webmvc, webflux, websocket)type: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions