2011-01-06 5 views
1

Ich verwende die folgende Klasse, um meine Beans mit Hibernate-Validierung zu validieren. Es funktioniert großartig. Es ist im Grunde genommen der Hörer here für JPA 1, konvertiert, um Bohnen in meinen Spring-Controllern zu validieren. Ich versuche, die zurückgegebenen Nachrichten anzupassen. This und jede andere Ressource, die ich finde, sagen Sie einfach eine ValidationMessages.properties-Datei in das Web-Inf-Verzeichnis. Diese Datei ist ebenfalls unten enthalten. Das funktioniert nicht. Irgendwelche Vorschläge?Ist eine Konfiguration erforderlich, um benutzerdefinierte Hibernate-Validierungsnachrichten zu verwenden?

public class BeanValidationTool { 

    public void validate(Object entity) { 
     TraversableResolver tr = new MyTraversableResolver(); 
     Validator validator = Validation.buildDefaultValidatorFactory().usingContext().traversableResolver(tr).getValidator(); 
     final Set<ConstraintViolation<Object>> constraintViolations = validator.validate(entity); 
     if (constraintViolations.size() > 0) { 
      Set<ConstraintViolation<?>> propagatedViolations = new HashSet<ConstraintViolation<?>>(constraintViolations.size()); 
      Set<String> classNames = new HashSet<String>(); 
      for (ConstraintViolation<?> violation : constraintViolations) { 
       propagatedViolations.add(violation); 
       classNames.add(violation.getLeafBean().getClass().getName()); 
      } 
      StringBuilder builder = new StringBuilder(); 
      builder.append("validation failed for classes "); 
      builder.append(classNames); 
      throw new ConstraintViolationException(builder.toString(), propagatedViolations); 
     } 
    } 

    public class MyTraversableResolver implements TraversableResolver { 

     public boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) { 
      return traversableObject == null || Hibernate.isInitialized(traversableObject); 
     } 

     public boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) { 
      return true; 
     } 
    } 
    }` 

ValidationMessages.properties Datei

validator.min = must be greater than or equal to {value} 

validator.notEmpty = This field can't be empty 

Antwort

1

Sie haben Message in Ihrem Anwendungskontext zu definieren:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" abstract="false" 
     scope="singleton" lazy-init="default"> 
    <property name="basename" value="ValidationMessages"/> 
</bean> 

als Sie gerade die Bohnen verwenden, um die Nachrichten abzurufen:

@Autowired 
private MessageSource messageSource; 

public String getMessage(String messageName) { 
    return messageSource.getMessage(messageName, null, null); 
} 

Um die Bohnen in Kontext zugreifen, die Sie dies tun müssen, um auch:

@Component 
public class BeanValidationTool{... 
+0

Dies ist eine große Beschreibung, wie benutzerdefinierte Nachrichten im Frühjahr einzurichten, aber vielleicht mein Verständnis ist begrenzt, Ich denke, um Hibernate-Validator-Nachrichten spezifisch anpassen zu können, sollte ich keine Bean verwenden müssen. Stattdessen sollten die Werte automatisch ersetzt werden und beim Aufruf der Validierungsmethode zurückgegeben werden. – coder

Verwandte Themen