Frage

Ich versuche 4.1 Standard ResourceBundleLocator in Hibernate Validierung außer Kraft zu setzen. Bisher funktioniert es perfekt, aber die einzigen Beispiele für seine Verwendung sind Java-Code zu ValidationFactory instanziiert.

Wenn Sie eine Web-Anwendung mit Feder Hibernate Validierung wird automatisch konfiguriert (nur die geeignete Hibernate Validierung * .jar-Datei sollte vorhanden sein und es wird automatisch verwendet). Wie kann ich ResourceBundleLocator in diesem Szenario ersetzen? Ich sehe keine Möglichkeit, von specyfing meine Gewohnheit ResourceBundleLocator in jeder Eigenschaft oder applicationContext.xml Datei.

War es hilfreich?

Lösung

Die magische Methode, die die erforderliche Arbeit erledigt ist LocalValidatorFactoryBean # setValidationMessageSource (Messagemessage) .

Zu allererst Vertrag des Verfahrens: -

Geben Sie eine benutzerdefinierte Frühling Message zur Validierung Lösung Nachrichten, anstatt sich auf JSR-303-Standard "ValidationMessages.properties" bundle in dem Classpath. Dies kann zu einem verweisen Frühling Kontext ist geteilt „Message“ Bohne, oder einige spezielle Message Setup für Validierungszwecke nur.

Hinweis: Diese Funktion erfordert Hibernate Validator 4.1 oder höher auf der Classpath. Sie können trotzdem ein verwenden verschiedene Validierungsanbieter aber Hibernate Validator des ResourceBundleMessageInterpolator Klasse muss zugänglich sein während Konfiguration.

Geben Sie entweder diese Eigenschaft oder "MessageInterpolator", nicht beides. Wenn Sie möchten eine benutzerdefinierte bauen MessageInterpolator betrachten Ableiten von Hibernate Validator des ResourceBundleMessageInterpolator und Bestehen in einem Frühling MessageSourceResourceBundleLocator beim Aufbau Ihres Interpolator.

Sie können Ihre benutzerdefinierten message.properties (oder .xml) angeben, indem diese Methode aufgerufen wird ... wie dieses ...

my-beans.xml

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

<bean name="resourceBundleLocator" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>META-INF/validation_errors</value>
        </list>
    </property>
</bean>

validation_errors.properties

javax.validation.constraints.NotNull.message=MyNotNullMessage

Person.java

    class Person {
    private String firstName;
    private String lastName;

    @NotNull
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

BeanValidationTest.java

    public class BeanValidationTest {

    private static ApplicationContext applicationContext; 

    @BeforeClass
    public static void initialize() {
        applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/spring/webmvc-beans.xml");
        Assert.assertNotNull(applicationContext);
    }

    @Test
    public void test() {
        LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class);
        Validator validator = factory.getValidator();
        Person person = new Person();
        person.setLastName("dude");
        Set<ConstraintViolation<Person>> violations = validator.validate(person);
        for(ConstraintViolation<Person> violation : violations) {
            System.out.println("Custom Message:- " + violation.getMessage());
        }
    }

}

Outupt: Custom Message:- MyNotNullMessage

Andere Tipps

Hier ist eine Lösung, wenn Sie die vorhandenen Hibernate Prüfungsmeldungen und benutzerdefinierte Validierungsmeldungen mischen möchten:

<mvc:annotation-driven validator="validator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames" value="i18n,iso-i18n,org.hibernate.validator.ValidationMessages" />
    <property name="useCodeAsDefaultMessage" value="true" />
</bean>

(siehe Web MVC-Framework Validation Abschnitt und Konfigurieren eines Provider Bean Validation im Frühjahr Dokumentation)

Danke @ Lu55, basierend auf Ihrer Antwort löste ich mein Problem !!

ich in eine Configuration-Klasse nur umgewandelt, und ich bin Entsendung hier nur für den Fall jemand anderes Bedürfnis:

Angaben zum Import: es funktionierte für mich mit ReloadableResourceBundleMessageSource, aber es hat nicht funktioniert ResourceBundleMessageSource verwenden. Ich bin nicht sicher, warum.

@Configuration
public class ErrorConfig {

    @Bean
    public Validator validatorFactory (MessageSource messageSource) {
        LocalValidatorFactoryBean validator =  new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource);
        return validator;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
        bean.addBasenames("classpath:org.hibernate.validator.ValidationMessages","classpath:message");
        bean.setDefaultEncoding("UTF-8");
        return bean;
    }
}

In meiner Ressource-Ordner Ich habe message.properties Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top