2017-06-12 2 views
0

Ich versuche, Javax Validierungen auf DTO zu verwenden. Aber ich möchte, dass diese Validierungen basierend auf der Operation angewendet werden, für die dieses DTO verwendet wird.javax Validierung basierend auf Operation

Können sagen, ich habe folgendes DTO:

@Getter @Setter 
public class CustomerDTO { 

    @NotNull 
    private String id; 

    @NotNull 
    private String name; 
} 

ich die gleiche DTO bin mit für Erstellen, Aktualisieren und Löschen von Operationen. Im Fall von Update und Delete-Operation Ich möchte "ID" NotNull sein, aber in Erstellen muss es null sein.

Da ich jedoch das gleiche DTO verwende und @Valid Annotation auf Controller-Ebene verwende, gilt es für alle Attribute. Und die folgende API nicht als „id“ nicht null sein kann

public CustomerDTO createCustomer(@Valid CustomerDTO customer, BindingResults results){ 
    if(results.hasErrors()){ 
     throw IllegalArgumentsException("Required params are mising"); 
    } 
    customerService.create(customer); 
} 
+0

Ich empfehle statt zu versuchen, [Update und Delete Operation Not Null mit javax], @NotNull Annotation an ID zu entfernen und NOT NULL Constraints in Ihrer DB, und überprüfen Sie dann Bedingung (ID nicht null) bei Update und Delete-Vorgang. – Alice

+0

Danke Alice. Ich versuche tatsächlich ein Framework zu erstellen, da es viele Entitäten in unserem Produkt gibt. Ich habe NOT NULL Constraints in der DB. Durch die Verwendung von javax.validation wird eine Menge Code von Boiler-Platten entfernt und sogar lokalisierte Fehlermeldungen unterstützt. –

+0

Erstellen Sie separate Klassen InsertCustomerDTO und UpdateCustomerDTO, die denselben BaseCustomerDTO erweitern und die gewünschte Validierung in den Klassen hinzufügen. – StanislavL

Antwort

2

Da Sie Frühling verwenden, können Sie seine @Validated Annotation und System.

Wie es funktioniert: jede Validierungsannotation hat ein Feld groups. In diesem Feld können Sie festlegen, wann die Validierung basierend auf einer Klasse durchgeführt werden soll. Was Sie tun können, ist folgendes:

  1. Erstellen Sie eine ValidationGroups Klasse mit allen Validierungsgruppen, die Sie benötigen. Beispiel:
import javax.validation.groups.Default; 

/** 
* Utility classes to distinct CRUD validations.<br> 
* <br> 
* Used with the 
* {@link org.springframework.validation.annotation.Validated @Validated} 
* Spring annotation. 
*/ 
public final class ValidationGroups { 

    private ValidationGroups() { 
    } 

    // Standard groups 

    public interface Create extends Default {}; 
    public interface Replace extends Default {}; 
    public interface Update extends Default {}; 
    public interface Delete extends Default {}; 
} 
  1. Für Ihren Fall mit Anmerkungen versehen id Feld wie folgt aus:
@Null(
    groups = Create.class 
) 
@NotNull(
    groups = { Update.class, Delete.class } 
) 
private String id; 
  1. Abschließend sagen Sie Controller-Seite, welche Gruppe (n) Sie mit der @Validated Annotation validieren möchten, anstatt die @Valid ein:
public CustomerDTO createCustomer(@Validated(Create.class) CustomerDTO customer, BindingResult results) { 
    if(results.hasErrors()){ 
     throw IllegalArgumentsException("Required params are mising"); 
    } 
    customerService.create(customer); 
} 

// Etc. You can put multiple groups like @Validated({ Update.class, Delete.class }) 

HINWEIS über die extends javax.validation.groups.Default in ValidationGroups:

Wenn Sie erstrecken sich nicht Ihre Create Klasse mit javax.validation.groups.Default, wird die Gültigkeitsregel nicht, wenn Sie die Verwendung erfolgen @Validated Annotation ohne Argument.

// @Validated without argument validate every annotation with the "Default" group 
public void test(@Validated MyForm form, BindingResult results) { 
    // ... 
} 

Sie können die Validierung erben. Wenn Sie beispielsweise Ihre Replace Ihre Validierungsregeln Create validieren möchten, machen Sie Replace erben Create.

public interface Create extends Default {}; 
public interface Replace extends Create {}; 
+0

Feldgruppen sind sehr nützlich, als ich dachte! – Alice

+0

Danke Kagmole. Genau das habe ich gesucht. Werde es ausprobieren. –

0

Nur nicht nennen die validate Methode, wenn die Operation ‚create‘ aufgerufen wird. Wenn Sie die anderen Felder in Ihrem DTO validieren müssen, füllen Sie alternativ einen Dummy-Wert für die ID aus, die Sie nach dem Aufruf von validate ignorieren können.

+0

Danke VHS. Dies ist möglicherweise nicht der richtige Weg, dies zu tun. –

Verwandte Themen