Skip to content

Commit

Permalink
Adapt ConstraintViolation's from method validation
Browse files Browse the repository at this point in the history
  • Loading branch information
rstoyanchev committed Jun 12, 2023
1 parent 38abee0 commit 425d5a9
Show file tree
Hide file tree
Showing 8 changed files with 1,237 additions and 169 deletions.

Large diffs are not rendered by default.

This file was deleted.

@@ -0,0 +1,118 @@
/*
* 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.validation.beanvalidation;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Set;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;

/**
* Extension of {@link ConstraintViolationException} that exposes an additional
* list of {@link ParameterValidationResult} with violations adapted to
* {@link org.springframework.context.MessageSourceResolvable} and grouped by
* method parameter.
*
* <p>For {@link jakarta.validation.Valid @Valid}-annotated, Object method
* parameters or return types with cascaded violations, the {@link ParameterErrors}
* subclass of {@link ParameterValidationResult} implements
* {@link org.springframework.validation.Errors} and exposes
* {@link org.springframework.validation.FieldError field errors}.
*
* @author Rossen Stoyanchev
* @since 6.1
* @see ParameterValidationResult
* @see ParameterErrors
* @see MethodValidationAdapter
*/
@SuppressWarnings("serial")
public class MethodValidationException extends ConstraintViolationException {

private final Object target;

private final Method method;

private final List<ParameterValidationResult> allValidationResults;


public MethodValidationException(
Object target, Method method,
List<ParameterValidationResult> validationResults,
Set<? extends ConstraintViolation<?>> violations) {

super(violations);
this.target = target;
this.method = method;
this.allValidationResults = validationResults;
}


/**
* Return the target of the method invocation to which validation was applied.
*/
public Object getTarget() {
return this.target;
}

/**
* Return the method to which validation was applied.
*/
public Method getMethod() {
return this.method;
}

/**
* Return all validation results. This includes method parameters with
* constraints declared on them, as well as
* {@link jakarta.validation.Valid @Valid} method parameters with
* cascaded constraints.
* @see #getValueResults()
* @see #getBeanResults()
*/
public List<ParameterValidationResult> getAllValidationResults() {
return this.allValidationResults;
}

/**
* Return only validation results for method parameters with constraints
* declared directly on them. This excludes
* {@link jakarta.validation.Valid @Valid} method parameters with cascaded
* constraints.
* @see #getAllValidationResults()
*/
public List<ParameterValidationResult> getValueResults() {
return this.allValidationResults.stream()
.filter(result -> !(result instanceof ParameterErrors))
.toList();
}

/**
* Return only validation results for {@link jakarta.validation.Valid @Valid}
* method parameters with cascaded constraints. This excludes method
* parameters with constraints declared directly on them.
* @see #getAllValidationResults()
*/
public List<ParameterErrors> getBeanResults() {
return this.allValidationResults.stream()
.filter(result -> result instanceof ParameterErrors)
.map(result -> (ParameterErrors) result)
.toList();
}

}
Expand Up @@ -55,30 +55,30 @@
*/
public class MethodValidationInterceptor implements MethodInterceptor {

private final MethodValidationDelegate delegate;
private final MethodValidationAdapter delegate;


/**
* Create a new MethodValidationInterceptor using a default JSR-303 validator underneath.
*/
public MethodValidationInterceptor() {
this.delegate = new MethodValidationDelegate();
this.delegate = new MethodValidationAdapter();
}

/**
* Create a new MethodValidationInterceptor using the given JSR-303 ValidatorFactory.
* @param validatorFactory the JSR-303 ValidatorFactory to use
*/
public MethodValidationInterceptor(ValidatorFactory validatorFactory) {
this.delegate = new MethodValidationDelegate(validatorFactory);
this.delegate = new MethodValidationAdapter(validatorFactory);
}

/**
* Create a new MethodValidationInterceptor using the given JSR-303 Validator.
* @param validator the JSR-303 Validator to use
*/
public MethodValidationInterceptor(Validator validator) {
this.delegate = new MethodValidationDelegate(validator);
this.delegate = new MethodValidationAdapter(validator);
}

/**
Expand All @@ -88,7 +88,7 @@ public MethodValidationInterceptor(Validator validator) {
* @since 6.0
*/
public MethodValidationInterceptor(Supplier<Validator> validator) {
this.delegate = new MethodValidationDelegate(validator);
this.delegate = new MethodValidationAdapter(validator);
}


Expand Down Expand Up @@ -153,7 +153,7 @@ else if (FactoryBean.class.isAssignableFrom(clazz)) {
protected Class<?>[] determineValidationGroups(MethodInvocation invocation) {
Object target = getTarget(invocation);
Method method = invocation.getMethod();
return this.delegate.determineValidationGroups(target, method);
return MethodValidationAdapter.determineValidationGroups(target, method);
}

}

0 comments on commit 425d5a9

Please sign in to comment.