2012-01-30 15 views
9

ओवरराइड कर सकते हैं मैं नीचे की तरह एक परीक्षण है:मैं एक JSR-303 मान्यता एनोटेशन

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(); 
    } 

} 
} 
निम्नलिखित उत्पादन के साथ

:
[ConstraintViolationImpl{interpolatedMessage='P', propertyPath=lst, rootBeanClass=class com....validator.TestSizeAnnotation$C, messageTemplate='P'}]

हालांकि, मैं उम्मीद है कि एनोटेशन @Size अधिरोहित जा सकता है, और कोई चेतावनी नहीं दिखाई देगी।
क्या इसे पूरा करने का कोई तरीका है?

संपादित करें: मुझे bug मिला है, लेकिन मैं 4.2.0 फ़ाइनल चलाता हूं और अभी भी उपर्युक्त व्यवहार प्राप्त करता हूं।

उत्तर

12

प्रमाणीकरण एनोटेशन ओवरराइड करना वास्तव में जेएसआर -303 के लिए समर्थित नहीं है। इसके बजाय उपवर्ग में ओवरराइड तरीकों पर भी टिप्पणियां संचयी लागू किया जाएगा: विनिर्देश की धारा 3.3 से:

 
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

आप कर सकते हैं एक्सएमएल विन्यास के माध्यम से एक टिप्पणी के लिए कॉन्फ़िगर किया गया सत्यापन ovveride:

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

आपके मामले में, आप getList (के लिए एक अलग मान्यता (या कोई मान्यता) यह घोषणा करते हैं) validation.xml में methid फ़ाइल, यह @Size एनोटेशन ओवरराइड करेगा।

+0

नहीं , मैं डिफ़ॉल्ट सत्यापनकर्ता का उपयोग करना चाहता हूं, लेकिन एनोटेशन को ओवरराइड करना चाहता हूं। – oshai

+0

क्षमा करें, अब मैं देखता हूं कि आपका क्या मतलब है। मैंने अपना जवाब संपादित कर लिया है। –

+0

धन्यवाद, कोड में ऐसा करने का कोई तरीका है? – oshai

1
बस रिकॉर्ड के लिए

, मैं एक बाईपास मेरी समस्या के लिए मिल गया है:

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

यह एक ओवरराइड नहीं है, यह संचयी है। इस मामले में प्रारंभिक सत्यापन हमेशा पास होगा यदि दूसरा सत्यापन पास हो जाता है, लेकिन अन्य मामलों में, जहां उदाहरण के लिए प्रारंभिक सत्यापन न्यूनतम (...) है और फिर आप ओवरराइडिंग विधि में अधिकतम (...) जोड़ते हैं, तो आप ' क्या यह न्यूनतम और अधिकतम दोनों सत्यापन का उपयोग करेगा (मैक्स प्रारंभिक न्यूनतम ओवरराइड नहीं करेगा)। –

संबंधित मुद्दे