2017-12-20 10 views
0

Ich verwende Hibernate Validator API, um die Felder auf meine Objekte zu validieren. Das Beispiel, wie es aussieht, ist unten.JSR 303 werfen Ausnahme auf alle Constraint-Verletzung

@NotNull @Size(min = 3, max = 8) String name; 
@NotNull @Size(min = 3, max = 16) String surname; 
@Size(min = 3, max = 10) String company; 
// ... 

Jetzt ist das Problem damit, dass ich mein Objekt konstruieren kann und keine Ausnahme geworfen wird. Beispielsweise.

Person p = new Person("a", "b", "c"); 

Dadurch werden keine Laufzeitausnahmen ausgelöst, stattdessen wird ein Objekt mit verletzten Einschränkungen erstellt. Und um die verletzten Einschränkungen zu erhalten, sollte eine Validator Instanz explizit aus dem Client-Code aufgerufen werden. Ich bin nicht ganz sicher, warum sie es so gemacht haben, aber ich brauche die Konstruktion eines Objekts, das mit einer Ausnahme fehlschlägt, wenn die Felder des Objekts verletzt werden. So etwas wie:

Person p = new Person("a", "b", "c"); 

... würde eine Ausnahme auslösen. Und das ungültige Objekt konnte nicht erstellt werden. Das ist mein gewünschtes Verhalten.

Ist das möglich?

Antwort

0

Warum überprüfen Sie nicht einfach die Werte in ctor, wenn Sie ein Objekt erstellen?

public Person(String name, String surname, String company) { 
    if(name == null || name.length() < 3) { 
     throw new IllegalArgumentException("useful message") 
    } 
} 

Ich nehme jedoch an, dass diese Anmerkungen nur funktionieren, wenn Objekte in DB gespeichert werden.

+0

Sie verstehen, dass dies nur ein einfaches Beispiel ist, das versucht, meine Anforderung zu erklären? Das reale Objekt hat 30 Felder, verwendet ein Builder-Muster usw., also ist etwas, was Sie vorschlagen, unmöglich. Wie ich sagte, ich muss die Konstruktion fehlschlagen, wenn die Einschränkungen verletzt werden – wesleyy

0

Der Hibernate-Validator kann Ihre Konstruktoren nicht abfangen, um die Validierung auszuführen.

Sie brauchen also etwas zu tun.

Sie können wahrscheinlich erreichen, was Sie wollen, indem Sie die Klassen (mit ByteBuddy oder etwas ähnliches) instrumentieren, aber ich bin nicht sicher, dass ich das empfehlen würde.

Der einfachste Weg besteht darin, einen Service oder etwas Ähnliches zu erstellen, das Ihr Objekt instanziiert und dann die Validierung ausführt.

+0

Das Problem mit instanziate Objekt und validiere es in einem Service (oder ähnlichem) ist, dass meine Objekte mit Builder erstellt werden. Der einzige Weg wäre dann, die Validierung innerhalb der Build-Methode zu haben, die nicht richtig erscheint? Und auch ziemlich schwierig zu implementieren (aber wahrscheinlich möglich), wenn Sie AutoValue.Builder verwenden, die ich bin – wesleyy

+0

Sie können versuchen, Ihre Klassen mit ByteBuddy instrumentieren. Nicht sicher, es wird aber einfacher. –

Verwandte Themen