2013-01-14 11 views
5

Używam sprawdzania poprawności dla fasoli w moim projekcie i chcę napisać niestandardowy weryfikator dla istniejącej adnotacji ograniczenia.Zarejestruj niestandardowy obiekt ConstraintValidator dla istniejącego ograniczenia

Na przykład mam klasę, która reprezentuje datę/godzinę o nazwie CustomDateTime. W klasie, która używa tej klasy jak na przykład data urodzenia Chciałbym opisywanie tej dziedzinie @Past:

public class Person 
{ 
    @Past 
    private CustomDateTime dateOfBirth; 
} 

I wtedy utworzyć własny walidator poprzez wdrożenie ConstraintValidator<Past, CustomDateTime>. To jednak nie działa, ponieważ implementacja sprawdzania poprawności nie ma wiedzy o niestandardowym weryfikatorze. Następnie rzuca: javax.validation.UnexpectedTypeException: No validator could be found for type: com.example.CustomDateTime.

wiem, że zazwyczaj utworzenie osobnego adnotacji takiego:

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

Ale to wydaje się podwójnym kodem do mnie ;-)

Jak mogę zarejestrować niestandardowy walidator do stosowania z @Past ?

Odpowiedz

4

Można zdefiniować XML-based constraint mapping który dodaje swój ograniczający walidator dla istniejącego @Past przymusu:

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

wówczas odniesienie to odwzorowanie w 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> 

Albo dodasz go w czasie startu swoje walidator:

InputStream mappingStream = ...; 

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

@ siebz0r Czy to działa dla ciebie? –

Powiązane problemy