2013-01-14 24 views
5

我在我的項目中使用bean驗證,我想爲現有約束註釋編寫自定義驗證程序。爲現有約束註冊自定義ConstraintValidator

例如,我有一個代表日期/時間名爲CustomDateTime的類。在使用這個類,例如我想註釋字段@Past出生日期一類:

public class Person 
{ 
    @Past 
    private CustomDateTime dateOfBirth; 
} 

我然後創建通過實施ConstraintValidator<Past, CustomDateTime>一個自定義的驗證。 但是這不起作用,因爲驗證實現沒有定製驗證器的知識。然後它拋出:javax.validation.UnexpectedTypeException: No validator could be found for type: com.example.CustomDateTime

我知道,你通常會創建一個單獨的註釋是這樣的:

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

但是,這似乎是雙碼我;-)

如何註冊自定義驗證與@Past使用?

回答

4

您可以定義一個XML-based constraint mapping它增加了您的約束驗證爲現有@Past約束:

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

然後要麼引用這個映射在你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> 

或者你白手創業過程中其添加到您驗證者:

InputStream mappingStream = ...; 

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

@ siebz0r它對你有用嗎? –