2016-03-07 16 views
15

मैं कोटलिन को स्प्रिंग-डेटा-रेस्ट प्रोजेक्ट पर जेएसआर 303 सत्यापन के साथ काम करने की कोशिश कर रहा हूं।कोटलिन डेटा क्लास + बीन सत्यापन जेएसआर 303

निम्नलिखित डेटा वर्ग declarartion को देखते हुए:

@Entity data class User(
    @Id 
    @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO) 
    var id: Long? = null, 

    @Size(min=5, max=15) 
    val name: String 
) 

@Size एनोटेशन यहाँ कोई प्रभाव नहीं है, मुझे 1 चरित्र का एक नाम के साथ एक उपयोगकर्ता को बचाने में सफल रही है।
यह वही उदाहरण निष्पादित करते समय अच्छी तरह से काम करता है लेकिन कोटलिन की बजाय जावा क्लास में।

इससे मुझे कोटलिन समस्या के बारे में सोचना पड़ता है।

आपकी मदद के लिए अग्रिम धन्यवाद!

+0

एनोटेशन का लक्ष्य क्या होना चाहिए? कन्स्ट्रक्टर पैरामीटर या फ़ील्ड? – voddan

उत्तर

23

आप गेटर (जो JavaBeans शिकायत मेजबान द्वारा देखा जाएगा) की पैरामीटर बजाय निर्माता पर एनोटेशन लक्षित करने के लिए जब वहाँ कई हैं है एक संपत्ति निर्माता में घोषित करने के लिए डिफ़ॉल्ट के बाद से Annotation use-site targets उपयोग करने की आवश्यकता विकल्प उपलब्ध हैं। data कक्षा का उपयोग भी अनुचित हो सकता है (अंत पर नोट देखें)। Kotlin डॉक्स से

@Entity data class User(
    @Id 
    @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO) 
    var id: Long? = null, 

    @get:Size(min=5, max=15) // added annotation use-site target here 
    val name: String 
) 

property लक्ष्य आकर्षक लग सकता है, लेकिन यह केवल Kotlin से और नहीं जावा देखा जा सकता है। आम तौर पर get चाल करता है, और बीन set पर इसकी आवश्यकता नहीं है।

आप एक प्रयोग साइट लक्ष्य निर्दिष्ट नहीं करते हैं, लक्ष्य एनोटेशन के @Target एनोटेशन इस्तेमाल किया जा रहा के अनुसार चुना जाता है:

डॉक्स प्रक्रिया के रूप में वर्णन करते हैं। कई लागू लक्ष्यों को देखते हैं, तो निम्न सूची से पहले लागू लक्ष्य प्रयोग किया जाता है:

  • परम
  • संपत्ति
  • क्षेत्र

और @Size एनोटेशन है:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 

इसलिए PARAMETER एक वैध लक्ष्य है, और एकाधिक लक्ष्य उपलब्ध हैं (पैरामीटर, फ़ील्ड, विधि [get/set]) यह PARAMETER को चुनता है जो आप नहीं चाहते हैं। इसलिए जावाबीन होस्ट के लिए संपत्ति देखने के लिए यह गेटटर की तलाश करेगा (गुण गेटटर/सेटर द्वारा परिभाषित किए गए हैं और बैकिंग फ़ील्ड नहीं)।

Java samples में से एक में, यह पता चलता है:

public class Book { 
    private String title; 
    private String description; 

    // ... 

    @NotEmpty(groups={FirstLevelCheck.class, Default.class}) 
    @Size(max=30) 
    public String getTitle() { 
     return title; 
    } 

    // ... 
} 

कौन सा गेटर पर होने के हमारे उपयोग मेल खाता है। यदि यह कुछ सत्यापन एनोटेशन शो जैसे फ़ील्ड पर होना था, तो field उपयोग-साइट लक्ष्य देखें। या यदि क्षेत्र सार्वजनिक रूप से सुलभ होना चाहिए, तो कोटलिन में @JvmField annotation देखें।

नोट:दूसरों से नोट में उल्लेख किया है, आप की संभावना संस्थाओं के लिए एक data वर्ग का उपयोग कर नहीं विचार करना चाहिए अगर वे एक स्वत: जनरेट आईडी का उपयोग के बाद से यह नया पुनः प्राप्त करने के लिए के रूप में ही वस्तुओं के लिए मौजूद नहीं होगा वस्तुओं; और data कक्षा equals और hashCode उत्पन्न करेगी जिसमें सभी फ़ील्ड शामिल नहीं होंगे। आप Hibernate docs से इसके बारे में मार्गदर्शन पढ़ सकते हैं।

+0

आप रॉक! धन्यवाद ! '@get: Size (min = 5, max = 15) 'एनोटेशन का उपयोग करना भी संभव है। – pellenberger

+2

हालांकि यह सही उत्तर है, यह ध्यान देने योग्य है कि आपको किसी भी तरह से इकाई के लिए 'डेटा क्लास' का उपयोग नहीं करना चाहिए। कारण यह है - यह 'आईडी' सहित सभी गुणों का उपयोग करके 'बराबर' और 'हैशकोड' विधियों को उत्पन्न करेगा, जो जेपीए इकाई के लिए वांछित व्यवहार नहीं है। यहां देखें: https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes-equalshashcode.html – waste

+0

धन्यवाद @ वेस्ट, मैंने सीधे नोट जोड़ने के लिए एक संपादन किया जवाब। –

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