2017-12-05 4 views
2

Ich frage mich, ob es möglich ist, einen neuen Constraint-Validator eines benutzerdefinierten Typs zu einer Annotation zu registrieren, die durch die Bean-Validierungsspezifikation definiert ist. Zum Beispiel Image läßt ich habe eine Klasse, die mehr int WerteRegistrieren neuer Constraint-Validator für Standard-Bean-Validierungsannotation

public class IntContainer 
{ 
    private int value1; 
    private int value2; 


    public int getValue1() 
    { 
    return value1; 
    } 


    public void setValue1(final int value1) 
    { 
    this.value1 = value1; 
    } 


    public int getValue2() 
    { 
    return value2; 
    } 


    public void setValue2(final int value2) 
    { 
    this.value2 = value2; 
    } 
} 

ich eine benutzerdefinierte Einschränkung Validator registrieren möchte akkumuliert die @Positive Anmerkung für diese Art zu unterstützen (statt erstellt von einer benutzerdefinierten Anmerkung).

public class PositiveIntContainerValidator implements ConstraintValidator<Positive, IntContainer> 
{ 
    @Override 
    public boolean isValid(final IntContainer value, final ConstraintValidatorContext context) 
    { 
    //TODO: do some validation here based on IntContainer state 
    return false; 
    } 
} 

Damit später kann ich diese verwenden:

@Positive 
private IntContainer valueContainer; 

Antwort

1

Ein vollständig qualifizierter Name Ihres Validator kann META-INF/services/javax.validation.ConstraintValidator Datei hinzugefügt werden. Auf diese Weise kann der Hibernate Validator Ihren Validator abholen und für Ihre benutzerdefinierten Typen verwenden.

Weitere Details, wenn in diesem post erforderlich (siehe Abschnitt „Verwenden Sie Standard-Beschränkungen für Nicht-Standard-Klassen“)

+1

Great! Danke vielmals! –

0

Es ist nicht möglich, die @Positive Anmerkung auf Ihrer IntContainer Klasse zu verwenden, da der Validator dies nicht unterstützt Datentyp.

Unterstützte Typen für die @Positive Anmerkung sind:

  • BigDecimal
  • BigInteger
  • byte, short, int, long, float, double und ihre jeweiligen Umhüllungen

Siehe Annotation Type Positive .

Sie haben hier zwei Möglichkeiten, Sie könnten Ihren eigenen benutzerdefinierten Validator für IntContainer schreiben, oder Sie können den IntContainer von einer Entität abrufen, die über eine Membervariable verfügt, und diese dann validieren. Wie zum Beispiel:

Bean: public class IntContainer {

@Positive 
private int value1; 
@Positive 
private int value2; 

public IntContainer() { 

} 

public IntContainer(int value1, int value2) { 
    this.value1 = value1; 
    this.value2 = value2; 
} 

public int getValue1() { 
    return value1; 
} 

public void setValue1(final int value1) { 
    this.value1 = value1; 
} 


public int getValue2() { 
    return value2; 
} 


public void setValue2(final int value2) { 
    this.value2 = value2; 
} 

} 

Rest:

@POST 
public Response postTest(TestRest testRest) { 
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    Validator validator = factory.getValidator(); 

    Set<ConstraintViolation<IntContainer>> constraintViolations = validator.validate(testRest.getIntContainer()); 
    System.out.println(constraintViolations.size()); 

    return Response.status(Response.Status.OK).entity(constraintViolations.size()).build(); 
} 
+1

Das war das Ziel meiner Frage :) Nach der Antwort von @mark_o habe ich es geschafft. –

Verwandte Themen