wie man einen ConstraintValidator für die Liste erstellt

Ich habe einen einfachen Validator, um zu validieren, dass ein String-Wert Teil einer vordefinierten Liste ist:

public class CoBoundedStringConstraints implements ConstraintValidator { private List m_boundedTo; @Override public void initialize(CoBoundedString annotation) { m_boundedTo = FunctorUtils.transform(annotation.value(), new ToLowerCase()); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null ) { return true; } context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate("should be one of " + m_boundedTo).addConstraintViolation(); return m_boundedTo.contains(value.toLowerCase()); } } 

Zum Beispiel wird es validieren:

 @CoBoundedString({"a","b" }) public String operations; 

Ich möchte einen Validator erstellen Für eine Liste von Strings, um etwas wie dieses zu validieren:

 @CoBoundedString({"a","b" }) public List operations = new ArrayList(); 

Ich habe es versucht:

 public class CoBoundedStringListConstraints implements ConstraintValidator<CoBoundedString, List> { private CoBoundedString m_annotation; @Override public void initialize(CoBoundedString annotation) { m_annotation = annotation; } @Override public boolean isValid(List value, ConstraintValidatorContext context) { if (value == null ) { return true; } CoBoundedStringConstraints constraints = new CoBoundedStringConstraints(); constraints.initialize(m_annotation); for (String string : value) { if (!constraints.isValid(string, context)) { return false; } } return true; } } 

Das Problem ist, wenn die Liste 2 oder mehr ungültige Werte enthält, wird nur eine Constraint-Verletzung (die erste) bestehen. Ich möchte, dass es mehr als eins hat. Wie soll ich das machen?

Es gibt 2 Probleme mit Ihrem aktuellen Code:

In der CoBoundedStringListConstraints -Methode von isValid sollten Sie über alle Elemente der gegebenen Liste wie isValid iterieren (setzen Sie ein allValid Flag):

 @Override public boolean isValid(List value, ConstraintValidatorContext context) { if (value == null) { return true; } boolean allValid = true; CoBoundedStringConstraints constraints = new CoBoundedStringConstraints(); constraints.initialize(m_annotation); for (String string : value) { if (!constraints.isValid(string, context)) { allValid = false; } } return allValid; } 

Die zweite ist die Implementierung von equals für die Constraint-Verletzung ( javax.validation.Validator.validate() gibt eine Menge zurück! ). Wenn Sie immer dieselbe Nachricht eingeben ( should be one of [a, b] ), enthält das Set immer noch nur 1 Element. Als Lösung können Sie den aktuellen Wert der Nachricht voranstellen (class CoBoundedStringConstraints ):

 @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null) { return true; } if (!m_boundedTo.contains(value)) { context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate( value + " should be one of " + m_boundedTo) .addConstraintViolation(); return false; } return true; }