2011-10-21 5 views
12

मैं स्प्रिंग एमवीसी 3.0 के साथ एक नया जावा वेबपैप बना रहा हूं और जितना संभव हो उतना मानक जावा ईई 6 सामान का उपयोग करना चाहता हूं। (मैं ग्लासफ़िश 3.1.1 पर हूं।) असली चालक जेएसएफ की बजाय एमवीसी वेब ढांचे का उपयोग करना चाहता है।स्प्रिंग एमवीसी 3.0 और @EJB एनोटेशन का उपयोग करके मैपनाम नाम?

तो मैं अपने वसंत नियंत्रकों में ईजेबी को इंजेक्ट करने का सबसे अच्छा तरीका ढूंढ रहा हूं। मुझे कुछ सफलता मिली लेकिन मैं इस बात से खुश नहीं हूं कि यह कैसा दिखता है और मैं एक बेहतर तरीका खोजने की उम्मीद कर रहा था।

यह काम किया, JNDI के माध्यम से EJB का पता लगाकर:

// EJB 
@Stateless 
public class Service { 
    @PersistenceContext(name="MAIN") 
    private EntityManager em; 

    public void doSomething() { .... } 

} 

// Spring 
@Controller 
public class HomeController { 
    @EJB(mappedName="java:global/springtest/Service") 
    private Service service; 

    // controller methods use service 
} 

लेकिन मैं नियंत्रक में @EJB एनोटेशन पर "mappedName" की आवश्यकता होगी, से संतुष्ट नहीं हूं।

क्या ऐसा करने का कोई बेहतर तरीका है?

अच्छी खबर यह है कि मैं ईजेबी और वसंत बीन्स में एक ही @ इंजेक्ट एनोटेशन का उपयोग कर सकता हूं और केवल अंतर यह है कि कौन सा ढांचा वस्तु बना रहा है और इंजेक्शन कर रहा है।

उत्तर

-1

वसंत के लिए, आप JndiObjectFactoryBean में JNDI देखने लपेट सकता है:

<bean id="serviceBean" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:global/springtest/Service" /> 
    <property name="resourceRef" value="true" /> 
</bean> 

तो फिर तुम हूँ शायद (मुझे ठीक कर लें मैं गलत हूँ) बिना @Injectके साथ उपयोग करने में सक्षम हो @Named("serviceBean") एनोटेशन:

@Inject 
private Service service; 
+0

यह केवल एक्सएमएल को समस्या को धक्का देता है, जो खराब आईएमओ महसूस करता है। – wrschneider

+0

@ wrschneider99 क्यों? आप * मैप किए गए नाम * पैरामीटर से छुटकारा पाना चाहते थे और इसलिए आपको यह मिला। क्या वह सवाल नहीं था? अन्यथा आप कोड में जेएनडीआई लुकअप कर सकते हैं और यह पूरी तरह पोर्टेबल होगा, लेकिन बदसूरत। – MaDa

+0

मैं उम्मीद कर रहा था कि कुछ ऐसा तरीका था कि जेएनडीआई लुकअप सम्मेलन द्वारा हो सकता है, जैसे कि एक स्पष्ट मैप किए गए नाम अनावश्यक था। या यदि आवश्यक हो तो मैं ईजेबी एनोटेशन की वसंत की व्याख्या के निहित किसी भी चूक का लाभ उठाने के लिए, स्टेटलेस एनोटेशन को कॉन्फ़िगरेशन को दबाए रखने पर ध्यान नहीं रखूंगा। – wrschneider

2

तो आप का उपयोग

mappedName="java:module/Service" 

mappedName="java:global/springtest/Service" 

के बजाय आप APPNAME बारे में चिंता करने की जरूरत नहीं है। यह कोड को और अधिक पोर्टेबल बनाता है। मुझे लगता है कि आपकी कुछ समस्याएं हल हो जाएंगी

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