2013-01-14 7 views
5

Ich verwende Bean-Validierung in meinem Projekt und ich möchte einen benutzerdefinierten Validator für eine vorhandene Constraint-Annotation schreiben.Registrieren Sie benutzerdefinierte ConstraintValidator für vorhandene Constraint

Zum Beispiel habe ich eine Klasse, die ein Datum/Uhrzeit mit dem Namen CustomDateTime darstellt. In einer Klasse, die diese Klasse als zum Beispiel das Datum der Geburt verwendet würde ich das Feld zu annotieren gerne mit @Past:

public class Person 
{ 
    @Past 
    private CustomDateTime dateOfBirth; 
} 

Ich erstelle dann einen benutzerdefinierten Validator durch ConstraintValidator<Past, CustomDateTime> implementieren. Dies funktioniert jedoch nicht, da die Validierungsimplementierung den benutzerdefinierten Validator nicht kennt. Es wirft dann: javax.validation.UnexpectedTypeException: No validator could be found for type: com.example.CustomDateTime.

Ich weiß, dass Sie in der Regel eine separate Anmerkung wie folgt erstellen:

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = {CustomDateTimePastValidator.class}) 
public @interface Past 
{ 
    .... 
} 

Aber das scheint wie Doppelcode zu mir ;-)

Wie kann ich den benutzerdefinierten Validator registrieren @Past verwendet werden soll ?

Antwort

4

Sie können eine XML-based constraint mapping definieren, die für die bestehende @Past Einschränkung Ihre Constraint-Validator fügt hinzu:

<?xml version="1.0" encoding="UTF-8"?> 
<constraint-mappings 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd" 
    xmlns="http://jboss.org/xml/ns/javax/validation/mapping"> 

    <constraint-definition annotation="javax.validation.constraints.Past"> 
     <validated-by include-existing-validators="true"> 
      <value>com.acme.CustomDateTimePastValidator</value> 
     </validated-by> 
    </constraint-definition> 
</constraint-mappings> 

dann entweder Referenz diese Zuordnung in Ihrem validation.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<validation-config 
    xmlns="http://jboss.org/xml/ns/javax/validation/configuration" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration"> 

    <constraint-mapping>/path/to/constraint-mapping.xml</constraint-mapping> 
</validation-config> 

Oder Sie es hinzufügen während Bootstrapping Ihr Prüfer:

InputStream mappingStream = ...; 

Validator validator = Validation 
    .byDefaultProvider() 
    .configure() 
    .addMapping(mappingStream) 
    .buildValidatorFactory() 
    .getValidator(); 
+0

@ siebz0r Hat es für dich funktioniert? –

Verwandte Themen