es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Anular el validador predeterminado de Hibernate en spring web mvc

Spring está utilizando la fábrica de validadores por defecto proporcionada por hibernate factory. Sin embargo, no quiero incluir una dependencia de Lenguaje de Expresiones. Esta respuesta recomienda evitar el uso de la fábrica por defecto utilizando este código:

import javax.validation.Validation;
import javax.validation.Validator;
import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;

private static final Validator VALIDATOR =
  Validation.byDefaultProvider()
    .configure()
    .messageInterpolator(new ParameterMessageInterpolator())
    .buildValidatorFactory()
    .getValidator();

Eso funciona bien cuando tengo una referencia a VALIDATOR, pero no estoy seguro de cómo decirle a Spring que use lo anterior en lugar de la OptionalValidatorFactoryBean, que extiende LocalValidatorFactoryBean, que creo está rellenada con el validador de Validation.buildDefaultValidatorFactory() basado en el javadoc de LocalValidatorFactoryBean.

En resumen, ¿cómo reemplazo la fábrica de validadores por defecto de Spring Validation.buildDefaultValidatorFactory() con Validation.byDefaultProvider().configure().messageInterpolator(new ParameterMessageInterpolator()).buildValidatorFactory().getValidator() para evitar la dependencia del Lenguaje de Expresiones?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para reemplazar la default Validation.buildDefaultValidatorFactory() de Spring con Validation.byDefaultProvider().configure().messageInterpolator(new ParameterMessageInterpolator()).buildValidatorFactory().getValidator(), puedes crear un bean personalizado ValidatorFactory en la configuración de Spring.

    Primero, crea una nueva clase que implemente la interfaz javax.validation.ValidatorFactory. En esta clase, define la lógica necesaria para crear y configurar la instancia del validador:

    import javax.validation.Validation;
    import javax.validation.Validator;
    import javax.validation.ValidatorFactory;
    
    public class CustomValidatorFactory implements ValidatorFactory {
    
        private final Validator validator;
    
        public CustomValidatorFactory() {
            validator = Validation.byDefaultProvider()
                    .configure()
                    .messageInterpolator(new ParameterMessageInterpolator())
                    .buildValidatorFactory()
                    .getValidator();
        }
    
        @Override
        public Validator getValidator() {
            return validator;
        }
    
        @Override
        public ValidatorContext usingContext() {
            return validator.usingContext();
        }
    
        @Override
        public MessageInterpolator getMessageInterpolator() {
            return validator.getMessageInterpolator();
        }
    
        @Override
        public ValidationProviderResolver getValidationProviderResolver() {
            return validator.getValidationProviderResolver();
        }
    
        @Override
        public boolean isCascadedValidationPossible() {
            return validator.isCascadedValidationPossible();
        }
    
        @Override
        public <t> T unwrap(Class<t> type) {
            return validator.unwrap(type);
        }
    
        @Override
        public void close() {
            validator.unwrap(ValidatorFactory.class).close();
        }
    
    }
    

    Luego, crea un bean en el archivo de configuración de Spring que declare esta fábrica de validadores personalizada:

    <bean id="validatorFactory" class="com.example.CustomValidatorFactory"></bean>
    

    Finalmente, configura tu LocalValidatorFactoryBean para que use esta fábrica personalizada:

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validatorFactory" ref="validatorFactory"></property>
    </bean>
    

    Al hacer esto, Spring usará tu fábrica de validadores personalizada en lugar de la predeterminada proporcionada por Hibernate, lo que te permitirá evitar la dependencia del lenguaje de expresiones.

Comments are closed.