2009-11-29 9 views
6

मैं कई इनपुट फॉर्मों के साथ एक स्प्रिंग एप्लिकेशन पर काम कर रहा हूं। मैं यूआई फॉर्म, सत्यापन और जेपीए एनोटेशन में फील्ड लम्बाई का पुन: उपयोग करना चाहता हूं। क्या इसे हल करने का एक शानदार तरीका है। इस समय मेरे समाधान, स्थिरांक उपयोग करने के लिए है लंबाई घोषित करने के लिए:फॉर्म, सत्यापन और डीडीएल में फील्ड लम्बाई का पुन: उपयोग कैसे करें?

public class Person 
{ 
    public static final int FIRSTNAME_LENGTH = 25; 

    @Column(length=FIRSTNAME_LENGTH) 
    private String firstName; 

    ... 
} 

और फिर सत्यापनकर्ता और jsp

... 

<form:input path="firstName" 
    maxlength="<%= Integer.toString(Person.FIRSTNAME_LENGTH) %>"/> 

... 

जो बहुत वर्बोज़ है में लगातार पुन: उपयोग।

क्या इस समस्या का कोई और अधिक सुरुचिपूर्ण समाधान है?

+0

मुझे ठीक लग रहा है। – pstanton

+0

डोमिनिक, आपका "इन-सुरुचिपूर्ण" समाधान मेरे लिए बहुत चालाक दिखता है। मुझे इसका इस्तेमाल करना पड़ सकता है। अच्छा सवाल चाहे, यह सब कुछ करने के लिए है, लेकिन इसके लिए समाधान में ऐसा प्रतीत नहीं होता है। –

+0

मुझे खुशी है कि आप यहां एक बक्षीस डालते हैं, मैं इसे भी उत्तर देना चाहता हूं। काश है कि उनके पास समुदाय के बक्षीस के लिए एक सुविधा थी, मैं अपने कुछ प्रतिनिधि में फेंक दूंगा। –

उत्तर

10

एनोटेशन में संग्रहीत जानकारी तक पहुंचना काफी संभव है। वास्तव में, यह उनका मुख्य उद्देश्य है: कक्षा/विधि/क्षेत्र पर मेटा जानकारी संग्रहीत करना।

import javax.persistence.Column; 
import javax.persistence.Entity; 

@Entity 
public class Person { 

    @Column(length=30) 
    private String firstName; 

    public static void main(String[] args) throws SecurityException, NoSuchFieldException { 
     Object person = new Person(); 
     //find out length  
     System.out.println(person.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length()); 
    } 
} 

आप कुछ कस्टम टैग या सेम यह जानकारी सामान्य रूप से निकालने के लिए बनाने के लिए सक्षम होना चाहिए: यहाँ कैसे एक @Column एनोटेशन में संग्रहीत लंबाई तक पहुँचने के लिए का एक उदाहरण है।

अपनी खुद की टिप्पणियां बनाना मुश्किल नहीं है। आप एक बनाने पर विचार कर सकते हैं जो निर्दिष्ट करता है कि कौन से फ़ील्ड फॉर्म पर शामिल किए जाने हैं, उन्हें कैसे प्रस्तुत किया जाना चाहिए, विवरण इत्यादि। इससे आप एक सामान्य रूप बना सकते हैं। फिर फिर आप डोमेन और प्रस्तुति मिश्रण करना पसंद नहीं कर सकते हैं।

+0

यह काफी रेखा भरा है, प्रसिद्ध जावा terseness जीवित और अच्छी तरह से है। महान टिप, धन्यवाद। –

+0

बस एक फॉलो अप, java.lang.Class.getDeclaredField() दो चेक अपवाद फेंकता है, NoSuchFieldException और SecurityException। यह इस विधि को थोड़ा और अधिक कठोर बनाता है और यदि आप इस समाधान को लागू करने की कोशिश कर रहे हैं तो यह ध्यान में रखना है। –

1

मैं एक ऐसी ही सवाल जब मैं हाइबरनेट उपयोग कर रहा था,

Getting column length from Hibernate mappings?

कोई विचार कैसे तथापि जेपीए के तहत इस जानकारी को खींचने के लिए कहा, लेकिन अगर आप अपने अंतर्निहित परत के रूप में हाइबरनेट उपयोग कर रहे हैं आप सीधे हाइबरनेट तक पहुंचने का प्रयास कर सकते हैं और ऊपर दिए गए समाधान को कार्यान्वित कर सकते हैं।

हालांकि हाइबरनेट समाधान आपके उत्तर में उल्लिखित समाधान के रूप में उतना ही सुरुचिपूर्ण है, इसके अतिरिक्त नुकसान यह है कि यह आपके जेपीए कार्यान्वयन को हाइबरनेट से जोड़ता है।

0

ईजेबी द्वारा प्रदान किया गया समाधान कॉलम की लंबाई के लिए एनोटेटेड मान पढ़ता है। जेम्स मैकमोहन ने बताया कि यह हाइबरनेट कार्यान्वयन का खुलासा करता है। इसे गेटटर विधियों के साथ काफी आसानी से हल किया जा सकता है। मान लीजिए कि घोषित विधि वाले व्यक्ति के लिए एक इंटरफेस है फर्स्टनाम लम्बाई:

import javax.persistence.Column; 
import javax.persistence.Entity; 

@Entity 
public class PersonImplementation extends Person { 

    @Column(length=30) 
    private String firstName; 

    public int getFirstNameLength() { 
     return this.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length(); 
    } 
}