2013-01-14 41 views
5

Tôi sử dụng xác thực bean trong dự án của mình và tôi muốn viết trình xác thực tùy chỉnh cho chú thích ràng buộc hiện có.Đăng ký ConstraintValidator tùy chỉnh cho Hạn chế hiện tại

Ví dụ: tôi có một lớp đại diện cho ngày/giờ có tên CustomDateTime. Trong một lớp học có sử dụng lớp này như ví dụ như một ngày sinh tôi muốn chú thích lĩnh vực này với @Past:

public class Person 
{ 
    @Past 
    private CustomDateTime dateOfBirth; 
} 

tôi sau đó tạo ra một validator tùy chỉnh bằng cách thực hiện ConstraintValidator<Past, CustomDateTime>. Tuy nhiên, điều này không hoạt động vì việc triển khai xác thực không có kiến ​​thức về trình xác thực tùy chỉnh. Sau đó nó ném: javax.validation.UnexpectedTypeException: No validator could be found for type: com.example.CustomDateTime.

Tôi biết rằng bạn thường tạo ra một chú thích riêng như thế này:

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

Nhưng điều đó có vẻ như đang tăng gấp đôi với tôi ;-)

Làm thế nào tôi có thể đăng ký các validator tùy chỉnh để được sử dụng với @Past ?

Trả lời

4

Bạn có thể xác định một XML-based constraint mapping mà thêm validator hạn chế của bạn cho @Past hạn chế đang tồn tại:

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

Sau đó một trong hai tài liệu tham khảo bản đồ này trong validation.xml của bạn:

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

Hoặc bạn có thêm nó trong bootstrapping của bạn trình xác thực:

InputStream mappingStream = ...; 

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

@ siebz0r Nó có hiệu quả với bạn không? –

Các vấn đề liên quan