io.micronaut.configuration.hibernate.validator.MicronautHibernateValidator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of micronaut-hibernate-validator Show documentation
Show all versions of micronaut-hibernate-validator Show documentation
Provides integration between Micronaut and Hibernate Validator
The newest version!
/*
* Copyright 2017-2020 original 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 io.micronaut.configuration.hibernate.validator;
import io.micronaut.context.BeanResolutionContext;
import io.micronaut.context.annotation.Primary;
import io.micronaut.context.annotation.Replaces;
import io.micronaut.context.annotation.Requires;
import io.micronaut.context.exceptions.BeanInstantiationException;
import io.micronaut.core.util.StringUtils;
import io.micronaut.inject.BeanDefinition;
import io.micronaut.inject.annotation.AnnotatedElementValidator;
import io.micronaut.inject.validation.BeanDefinitionValidator;
import io.micronaut.validation.validator.*;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Singleton;
import javax.validation.ConstraintViolation;
import javax.validation.ValidatorFactory;
import javax.validation.metadata.BeanDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Set;
/**
* Replaces Micronaut Validator with Hibernate backed implementation.
*
* @author graemerocher
* @since 2.0.0
*/
@Singleton
@Primary
@Requires(property = ValidatorConfiguration.ENABLED, value = StringUtils.TRUE, defaultValue = StringUtils.TRUE)
@Replaces(DefaultValidator.class)
public class MicronautHibernateValidator extends DefaultValidator implements Validator, ExecutableMethodValidator, ReactiveValidator, AnnotatedElementValidator, BeanDefinitionValidator {
private final ValidatorFactory validatorFactory;
private final javax.validation.Validator validator;
/**
* Default constructor.
*
* @param validatorFactory The validator factory
* @param configuration The validator configuration
*/
protected MicronautHibernateValidator(ValidatorFactory validatorFactory, @Nonnull ValidatorConfiguration configuration) {
super(configuration);
this.validatorFactory = validatorFactory;
this.validator = validatorFactory.getValidator();
}
@Nonnull
@Override
public Set> validate(@Nonnull T object, @Nullable Class>... groups) {
return validator.validate(object, groups);
}
@Nonnull
@Override
public Set> validateProperty(@Nonnull T object, @Nonnull String propertyName, @Nullable Class>... groups) {
return validator.validateProperty(
object,
propertyName,
groups
);
}
@Nonnull
@Override
public Set> validateValue(@Nonnull Class beanType, @Nonnull String propertyName, @Nullable Object value, @Nullable Class>... groups) {
return validator
.validateValue(
beanType,
propertyName,
value,
groups
);
}
@Override
public BeanDescriptor getConstraintsForClass(Class> clazz) {
return validator.getConstraintsForClass(clazz);
}
@Override
public T unwrap(Class type) {
return validator.unwrap(type);
}
@Nonnull
@Override
public Set> validateReturnValue(@Nonnull T object, @Nonnull Method method, @Nullable Object returnValue, @Nullable Class>... groups) {
return validator.forExecutables().validateReturnValue(
object,
method,
returnValue,
groups
);
}
@Nonnull
@Override
public Set> validateConstructorParameters(@Nonnull Constructor extends T> constructor, @Nonnull Object[] parameterValues, @Nullable Class>... groups) {
return validator.forExecutables().validateConstructorParameters(
constructor,
parameterValues,
groups
);
}
@Nonnull
@Override
public Set> validateConstructorReturnValue(@Nonnull Constructor extends T> constructor, @Nonnull T createdObject, @Nullable Class>... groups) {
return validator.forExecutables().validateConstructorReturnValue(
constructor,
createdObject,
groups
);
}
@Override
public void validateBean(@Nonnull BeanResolutionContext resolutionContext, @Nonnull BeanDefinition definition, @Nonnull T bean) throws BeanInstantiationException {
Set> violations = validator.validate(bean);
final Class> beanType = bean.getClass();
failOnError(resolutionContext, violations, beanType);
}
private void failOnError(@Nonnull BeanResolutionContext resolutionContext, Set> errors, Class> beanType) {
if (!errors.isEmpty()) {
StringBuilder builder = new StringBuilder();
builder.append("Validation failed for bean definition [");
builder.append(beanType.getName());
builder.append("]\nList of constraint violations:[\n");
for (ConstraintViolation> violation : errors) {
builder.append("\t").append(violation.getPropertyPath()).append(" - ").append(violation.getMessage()).append("\n");
}
builder.append("]");
throw new BeanInstantiationException(resolutionContext, builder.toString());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy