2012-01-30 26 views
9

Tôi có một bài kiểm tra như dưới đây:tôi có thể ghi đè lên một JSR-303 xác nhận chú thích

public class TestSizeAnnotation 
{ 
public static void main(String[] args) 
{ 
    System.out.println(
      Validation.buildDefaultValidatorFactory().getValidator().validate(new C())); 
} 

public static class P 
{ 
    private List<String> lst = newArrayList("AA"); 
    @Size(max=0, message="P") 
    public List<String> getLst() 
    { 
     return lst; 
    } 
    public void setLst(List<String> lst) 
    { 
     this.lst = lst; 
    } 
} 
public static class C extends P 
{ 
    @Override 
    @Size(max=5, message="C") 
    public List<String> getLst() 
    { 
     return super.getLst(); 
    } 

} 
} 

với đầu ra sau đây:
[ConstraintViolationImpl{interpolatedMessage='P', propertyPath=lst, rootBeanClass=class com....validator.TestSizeAnnotation$C, messageTemplate='P'}]

Tuy nhiên, tôi mong rằng các chú thích có thể @Size được ghi đè, và sẽ không có cảnh báo nào xuất hiện.
Có cách nào để thực hiện điều đó không?

EDIT: Tôi tìm thấy một bug có vẻ liên quan đến điều đó, nhưng tôi chạy phiên bản 4.2.0 cuối cùng và vẫn nhận được hành vi ở trên.

Trả lời

12

Chú thích xác thực ghi đè thực sự không được hỗ trợ cho JSR-303. Thay vì chú thích về phương pháp ghi đè trong lớp con sẽ được áp dụng tích lũy: Từ phần 3.3 của đặc tả:

 
A constraint declaration can be placed on an interface. For a given class, 
constraint declarations held on super- classes as well as interfaces are 
evaluated by the Bean Validation provider. Rules are formally described in 
Section 3.4.5. 

The effect of constraint declarations is cumulative. Constraints declared 
on a superclass getter will be validated along with any constraints defined 
on an overridden version of the getter according to the Java Language 
Specification visibility rules. 
3

Bạn có thể ovveride chú thích cấu hình xác nhận thông qua cấu hình xml:

http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html_single/#validator-xmlconfiguration

Trong trường hợp của bạn, nếu bạn khai báo một xác nhận khác nhau (hoặc không hợp lệ) cho getList() methid trong validation.xml tệp sẽ ghi đè chú thích @Size.

+0

không , Tôi muốn sử dụng trình xác thực mặc định, nhưng ghi đè chú thích. – oshai

+0

Xin lỗi, giờ tôi hiểu ý của bạn là gì. Tôi đã chỉnh sửa câu trả lời của mình. –

+0

Cảm ơn, có cách nào để làm điều đó trong mã? – oshai

1

Chỉ cần cho các hồ sơ, tôi đã tìm thấy một bypass cho vấn đề của tôi:

public class TestSizeAnnotation 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("c " + 
       Validation.buildDefaultValidatorFactory().getValidator().validate(new C(), Default.class, SizeGroup2.class)); 
     System.out.println("p " + 
       Validation.buildDefaultValidatorFactory().getValidator().validate(new P(), Default.class, SizeGroup.class)); 
    } 
    public static interface SizeGroup {} 
    public static interface SizeGroup2 {} 
    public static class P 
    { 
     private List<String> lst = newArrayList("AA"); 
     @Size(max=0, message="P" , groups=SizeGroup.class) 
     public List<String> getLst() 
     { 
      return lst; 
     } 
     public void setLst(List<String> lst) 
     { 
      this.lst = lst; 
     } 
    } 
    public static class C extends P 
    { 
     @Override 
     @Size(max=5, message="C", groups=SizeGroup2.class) 
     public List<String> getLst() 
     { 
      return super.getLst(); 
     } 

    } 
} 
+1

Đó không phải là ghi đè, đó là tích lũy. Trong trường hợp này, xác thực ban đầu sẽ luôn luôn vượt qua nếu xác nhận lần thứ hai trôi qua, nhưng trong các trường hợp khác, ví dụ xác nhận ban đầu là Min (...) và sau đó bạn thêm Max (...) vào phương thức ghi đè, bạn ' sẽ có nó sử dụng cả hai xác nhận Min và Max (Max sẽ không ghi đè lên Min ban đầu). –

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