2012-03-31 14 views
4

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

Antwort

1

Alte Versionen von hibernate-validator erlauben nicht das Standardressourcenbündel außer Kraft zu setzen. Bitte stellen Sie sicher, dass Sie eine aktuelle Version wie die 4.2.0.Final verwenden.

Das heißt, auch wenn Sie bereits eine aktuelle Version verwenden, kann diese Version von der in Ihrem Anwendungsserver eingebetteten Version überschrieben werden. Glassfish 3.0 bettet beispielsweise eine Version von hibernate-validator ein, die die Ressourcenbündelüberschreibung nicht unterstützt.

+0

Hallo, danke für deine Antwort. Ich verwende 4.0.1.Final. – Rolf

+0

Aktualisieren Sie auf 4.2.0.Final und versuchen Sie es erneut. – tbruyelle

+0

wird versuchen, danke. – Rolf

1

Zur Meldung der Interpolation können Sie Nachricht von Klammern, wie diese gelten muss:

String message() default "{crossdate.validation.error}"; 

Siehe 2.2.4. Message interpolation Kapitel in Hibernate Validator Führer auch.