Frage

Wenn eine Java-Klasse mit einigen Feldern Ich mag Hibernate Validator zur Validierung verwenden. Jetzt möchte ich meine Benutzer zur Laufzeit konfigurieren können, die Platz Validierungen nehmen.

Zum Beispiel:

public class MyPojo {
    ...

    @NotEmpty
    String void getMyField() {
        ... 
    }

    ...
}

Lassen Sie uns sagen, dass ich die NotEmpty Check entfernen möchten oder ersetzen Sie es durch Email oder CreditCardNumber, wie kann ich es tun? Ist es überhaupt möglich? Ich denke, es kommt auf Anmerkungen zur Laufzeit zu ändern ...

War es hilfreich?

Lösung

Sie können es normalerweise nicht tun.

Hier ist, was ich getan habe, dynamischere Validierungen zum Laufen zu bringen über Hibernate Validator.

  1. Erweiterte ClassValidator Klasse.
  2. Ignoriere die getInvalidVaues(Object myObj) Methode. Rufen Sie zunächst super.getInvalidValues(myObj), dann fügen Sie den Haken zu Ihrer individuellen Validierung.
  3. Instantiate Ihre benutzerdefinierten Validator und rufen getInvalidValues zu validieren. Etwaige Hibernate kommentierte Validierungen wird an diesem Punkt beginnen, und Ihre individuellen dynamischen Validierungen (alles nicht von Anmerkungen unterstützt) werden auch beginnen.

Beispiel:

public class MyObjectValidator extends ClassValidator<MyObject>
{
    public MyObjectValidator()
    {
         super(MyObject.class);
    }

    public InvalidValue[] getInvalidValues(MyObject myObj)
    {
        List<InvalidValue> invalids = new ArrayList<InvalidValue>();
        invalids.addAll(Arrays.asList(super.getInvalidValues(myObj)));

        // add custom validations here
        invalids.addAll(validateDynamicStuff(myObj));

        InvalidValue[] results = new InvalidValue[invalids.size()];
        return invalids.toArray(results);
    }

    private List<InvalidValue> validateDynamicStuff(MyObject myObj)
    {
        // ... whatever validations you want ...
    }

}

So Ihre benutzerdefinierte Code-Validierung kann Logik enthalten, wie „diese Validierung durchführen, wenn der Benutzer es so konfiguriert, sonst tun, dass man“ usw. Sie können oder nicht in der Lage sein, den gleichen Code zu nutzen, die Befugnisse der Hibernate-Validierungen, aber So oder so, was Sie tun, ist mehr beteiligt, dass der ‚normale‘ Anwendungsfall für Hibernate Validator.

Andere Tipps

Eigentlich ist es möglich, in Hibernate Validator 4.1. Lesen Sie die Dokumentation zu programatic Einschränkung Schaffung .

Ich glaube nicht, Sie in der Lage sein werden, zu entfernen oder die Anmerkung zu ändern, es ist Teil der Klassendefinition ist. Sie können eine neue Klasse bauen, die zur Laufzeit, aber ein wenig beteiligt möglich ist. Hibernate kann programmatischen Zugriff auf die Validierungen unterstützen und ermöglicht es Ihnen, die Anmerkung außer Kraft zu setzen, ich weiß nicht, die API, die gut. Hibernate funktioniert ein bisschen Laufzeitklasse Gebäude selbst ... das könnte ein guter Ort sein, zu lernen, wie es zu tun, wenn Sie interessiert sind.

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