Ich weiß, das wurde schon tausend Mal gefragt, aber das ist wirklich ein Albtraum. Ich habe Tage, um herauszufinden versucht, wie Hibernate Validator zu konfigurieren, dass mein Eigentum Ressourcenpaket verwenden und ich kann immer noch kein zufriedenstellendes Ergebnis erhalten ...Spring MVC und JSR 303 benutzerdefinierte Validierung mit benutzerdefinierten Ressourcenbündel
Hier ist ein Teil meiner Web-Kontext:
<!-- i18n handling -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n.eSporx" />
</bean>
Hier ist ein Teil meines Anwendungskontextes:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
und schließlich meine (Klasse-Ebene Querfeld) benutzerdefinierte Einschränkung und sein Validator:
@Documented
@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = CrossDateConstraintsValidator.class)
public @interface CrossDateConstraints {
String message() default "crossdate.validation.error";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String startDateFieldName() default "startDate";
String endDateFieldName() default "endDate";
}
@Component
@Scope(SCOPE_PROTOTYPE)
public class CrossDateConstraintsValidator implements ConstraintValidator<CrossDateConstraints, Object> {
private String startDateField;
private String endDateField;
private String message;
@Override
public void initialize(final CrossDateConstraints constraintAnnotation) {
startDateField = constraintAnnotation.startDateFieldName();
endDateField = constraintAnnotation.endDateFieldName();
message = constraintAnnotation.message();
}
@Override
public boolean isValid(final Object annotatedClassInstance, final ConstraintValidatorContext context) {
boolean isValid = false;
try {
Date startDate = getDateFieldValue(annotatedClassInstance, startDateField);
Date endDate = getDateFieldValue(annotatedClassInstance, endDateField);
isValid = endDate.after(startDate);
if (!isValid) {
forceErrorsOnBothFields(context);
}
return isValid;
}
catch (Exception e) {
return isValid;
}
}
private void forceErrorsOnBothFields(final ConstraintValidatorContext context) {
context.buildConstraintViolationWithTemplate(message).addNode(startDateField).addConstraintViolation();
context.buildConstraintViolationWithTemplate(message).addNode(endDateField).addConstraintViolation();
}
private Date getDateFieldValue(final Object annotatedClassInstance, final String fieldName) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
Method dateGetter = new PropertyDescriptor(fieldName, annotatedClassInstance.getClass()).getReadMethod();
Date date = (Date) dateGetter.invoke(annotatedClassInstance);
return date;
}
}
Das Ressourcenpaket befindet sich unter src/main/resources/i18n/eSporx.properties
(mit seinen Gebietsschema-Varianten). Solche Dinge wie <spring:message code="my.key" />
in meinen JSPs funktionieren gut. Wenn jedoch ein CrossDateConstraints-Fehler ausgelöst wird, kann ich nur "crossdate.validation.error" lesen, auch wenn der Schlüssel in der Eigenschaftendatei gespeichert ist!
Wenn Sie eine Idee haben, bitte sagen Sie mir :) Dies ist so frustrierend.
Rolf
Hallo, danke für deine Antwort. Ich verwende 4.0.1.Final. – Rolf
Aktualisieren Sie auf 4.2.0.Final und versuchen Sie es erneut. – tbruyelle
wird versuchen, danke. – Rolf