Align validation metadata handling in PayloadMethodArgumentResolver
Reuses ValidationAnnotationUtils which is slightly optimized for the detection of Spring's Validated annotation now, also to the benefit of common web scenarios.
Closes gh-21852
(cherry picked from commit c7269feeaa)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
* 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.
|
||||
@@ -34,7 +34,6 @@ import org.springframework.core.MethodParameter;
|
||||
import org.springframework.core.ReactiveAdapter;
|
||||
import org.springframework.core.ReactiveAdapterRegistry;
|
||||
import org.springframework.core.ResolvableType;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.core.codec.Decoder;
|
||||
import org.springframework.core.codec.DecodingException;
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
@@ -55,17 +54,17 @@ import org.springframework.util.StringUtils;
|
||||
import org.springframework.validation.BeanPropertyBindingResult;
|
||||
import org.springframework.validation.SmartValidator;
|
||||
import org.springframework.validation.Validator;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.validation.annotation.ValidationAnnotationUtils;
|
||||
|
||||
/**
|
||||
* A resolver to extract and decode the payload of a message using a
|
||||
* {@link Decoder}, where the payload is expected to be a {@link Publisher} of
|
||||
* {@link DataBuffer DataBuffer}.
|
||||
* {@link Decoder}, where the payload is expected to be a {@link Publisher}
|
||||
* of {@link DataBuffer DataBuffer}.
|
||||
*
|
||||
* <p>Validation is applied if the method argument is annotated with
|
||||
* {@code @javax.validation.Valid} or
|
||||
* {@link org.springframework.validation.annotation.Validated}. Validation
|
||||
* failure results in an {@link MethodArgumentNotValidException}.
|
||||
* {@link org.springframework.validation.annotation.Validated} or
|
||||
* {@code @javax.validation.Valid}. Validation failure results in an
|
||||
* {@link MethodArgumentNotValidException}.
|
||||
*
|
||||
* <p>This resolver should be ordered last if {@link #useDefaultResolution} is
|
||||
* set to {@code true} since in that case it supports all types and does not
|
||||
@@ -287,10 +286,8 @@ public class PayloadMethodArgumentResolver implements HandlerMethodArgumentResol
|
||||
return null;
|
||||
}
|
||||
for (Annotation ann : parameter.getParameterAnnotations()) {
|
||||
Validated validatedAnn = AnnotationUtils.getAnnotation(ann, Validated.class);
|
||||
if (validatedAnn != null || ann.annotationType().getSimpleName().startsWith("Valid")) {
|
||||
Object hints = (validatedAnn != null ? validatedAnn.value() : AnnotationUtils.getValue(ann));
|
||||
Object[] validationHints = (hints instanceof Object[] ? (Object[]) hints : new Object[] {hints});
|
||||
Object[] validationHints = ValidationAnnotationUtils.determineValidationHints(ann);
|
||||
if (validationHints != null) {
|
||||
String name = Conventions.getVariableNameForParameter(parameter);
|
||||
return target -> {
|
||||
BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(target, name);
|
||||
|
||||
@@ -19,7 +19,6 @@ package org.springframework.messaging.handler.annotation.support;
|
||||
import java.lang.annotation.Annotation;
|
||||
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.converter.MessageConversionException;
|
||||
@@ -36,12 +35,16 @@ import org.springframework.validation.BindingResult;
|
||||
import org.springframework.validation.ObjectError;
|
||||
import org.springframework.validation.SmartValidator;
|
||||
import org.springframework.validation.Validator;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.validation.annotation.ValidationAnnotationUtils;
|
||||
|
||||
/**
|
||||
* A resolver to extract and convert the payload of a message using a
|
||||
* {@link MessageConverter}. It also validates the payload using a
|
||||
* {@link Validator} if the argument is annotated with a Validation annotation.
|
||||
* {@link MessageConverter}.
|
||||
*
|
||||
* <p>Validation is applied if the method argument is annotated with
|
||||
* {@link org.springframework.validation.annotation.Validated} or
|
||||
* {@code @javax.validation.Valid}. Validation failure results in an
|
||||
* {@link MethodArgumentNotValidException}.
|
||||
*
|
||||
* <p>This {@link HandlerMethodArgumentResolver} should be ordered last as it
|
||||
* supports all types and does not require the {@link Payload} annotation.
|
||||
@@ -190,8 +193,6 @@ public class PayloadMethodArgumentResolver implements HandlerMethodArgumentResol
|
||||
|
||||
/**
|
||||
* Validate the payload if applicable.
|
||||
* <p>The default implementation checks for {@code @javax.validation.Valid},
|
||||
* Spring's {@link Validated}, and custom annotations whose name starts with "Valid".
|
||||
* @param message the currently processed message
|
||||
* @param parameter the method parameter
|
||||
* @param target the target payload object
|
||||
@@ -202,10 +203,8 @@ public class PayloadMethodArgumentResolver implements HandlerMethodArgumentResol
|
||||
return;
|
||||
}
|
||||
for (Annotation ann : parameter.getParameterAnnotations()) {
|
||||
Validated validatedAnn = AnnotationUtils.getAnnotation(ann, Validated.class);
|
||||
if (validatedAnn != null || ann.annotationType().getSimpleName().startsWith("Valid")) {
|
||||
Object hints = (validatedAnn != null ? validatedAnn.value() : AnnotationUtils.getValue(ann));
|
||||
Object[] validationHints = (hints instanceof Object[] ? (Object[]) hints : new Object[] {hints});
|
||||
Object[] validationHints = ValidationAnnotationUtils.determineValidationHints(ann);
|
||||
if (validationHints != null) {
|
||||
BeanPropertyBindingResult bindingResult =
|
||||
new BeanPropertyBindingResult(target, getParameterName(parameter));
|
||||
if (!ObjectUtils.isEmpty(validationHints) && this.validator instanceof SmartValidator) {
|
||||
|
||||
Reference in New Issue
Block a user