2012-03-19 12 views
27

मैंने अपने प्राइमफेस संस्करण का उपयोग करने के लिए अपने जावा ईई वेब एप्लिकेशन को अपग्रेड किया और अचानक प्राइमफेस कमांडलिंक की एक्शन विशेषता में ओवरलोडेड बीन विधि की कॉल अब काम नहीं कर सका। मैंने परीक्षण करने के लिए जेएसएफ डिफ़ॉल्ट कमांडलिंक का उपयोग करने की कोशिश की और यह भी काम नहीं किया।ईएल समर्थन अतिभारित तरीकों करता है?

public void updateA(B b); 
public void updateA(A a); 

यह हमेशा बी

के लिए एक कास्ट करने के लिए करने की कोशिश की

अधिक उत्सुक, यह कैसे अपग्रेड से पहले वह काम कर सकता था:

विधि हस्ताक्षर इस प्रकार हैं?

उत्तर

32

ईएल इसका समर्थन नहीं करता, नहीं। यह हमेशा Class#getMethods() सरणी जिसका नाम (और तर्क की मात्रा) ईएल विधि कॉल से मेल खाता है की पहली विधि हो जाएगा। चाहे वह हर बार एक ही विधि देता है या नहीं, जेवीएम मेक/वर्जन पर निर्भर करता है। शायद आपने इस दौरान जावा एसई अपग्रेड भी बनाया है। जावाडोक यह भी कहता है:

लौटाए गए सरणी में तत्व सॉर्ट नहीं किए गए हैं और किसी भी विशेष क्रम में नहीं हैं।

आपको अनिर्दिष्ट व्यवहार पर भरोसा नहीं करना चाहिए। उन्हें एक अलग नाम दें।

+0

बहुत धन्यवाद, अपने विवरण स्पष्ट बातें बनाता है अब – djmj

+1

वहाँ किसी भी (तकनीकी) कारण है कि इस JSF 2 में किसी भी अधिक समर्थित नहीं है है? मुझे पूरा यकीन है कि जेएसएफ 1.x संस्करणों में यह संभव था, है ना? – MrD

+0

यह जेएसएफ विशिष्ट नहीं है। – BalusC

5

जिस तरह से आप यह आसपास पहुंच सकते हैं एक सामान्य विधि बना सकते हैं और उस विधि के अंदर 'मार्ग' करना है। मुझे पता है कि यह आदर्श नहीं हो सकता है, लेकिन आप कार्यों और XHTML पृष्ठ में कम विन्यास के साथ खत्म।

if (A.class.isInstance(obj)) { 
    A o = (A) obj; 
    return method(o, highRes); 
} else if (B.class.isInstance(obj)) { 
    B o = (B) obj; 
    return method(o, highRes); 
} else if (C.class.isInstance(obj)) { 
    C o = (C) obj; 
    return method(o, highRes); 
} else { 
    throw new FacesException("Unsupported Conversion: " + obj); 
}