2013-01-14 12 views
5

Uso la convalida del bean nel mio progetto e mi piacerebbe scrivere un validatore personalizzato per un'annotazione di vincolo esistente.Registrare vincolo personalizzato per vincolo esistente

Ad esempio, ho una classe che rappresenta una data/ora denominata CustomDateTime. In una classe che utilizza questa classe come ad esempio la data di nascita vorrei annotare il campo con @Past:

public class Person 
{ 
    @Past 
    private CustomDateTime dateOfBirth; 
} 

Ho quindi creare un validatore personalizzato implementando ConstraintValidator<Past, CustomDateTime>. Ciò tuttavia non funziona, poiché l'implementazione della convalida non ha alcuna conoscenza del validatore personalizzato. Quindi getta: javax.validation.UnexpectedTypeException: No validator could be found for type: com.example.CustomDateTime.

So che di solito si crea un'annotazione distinta come questo:

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

ma che sembra doppio codice per me ;-)

Come posso registrare il validatore personalizzato da utilizzare con @Past ?

risposta

4

È possibile definire un XML-based constraint mapping che aggiunge il vostro validatore vincolo per l'attuale @Past vincolo:

<?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> 

Allora o di riferimento questa mappatura in 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> 

O si aggiunge durante bootstrap tua validatore:

InputStream mappingStream = ...; 

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

@ siebz0r Ha funzionato per te? –