2012-06-26 9 views
17

मैं जैसे मॉड्यूल के साथ, एक बहु मॉड्यूल (Maven) वसंत MVC आवेदन बनाना चाहते हैं:एक स्प्रिंग एमवीसी परियोजना में स्कैला का प्रभावी ढंग से उपयोग कैसे करें?

web 
persistance (hibernate) 
core (general libs) 
models 
job-server (queue based jobs) 
services (business logic) 

अब इस परियोजना में स्काला उपयोग करने के लिए, मैं बिना किसी समस्या के हर जगह स्केला लिख ​​सकता है? या क्या मुझे वेब मॉड्यूल के लिए मेरे सेवा मॉड्यूल और जावा के लिए स्कैला का उपयोग करना चाहिए?

मुझे पता है कि हाइबरनेट को जावा में होना होगा।

विचार? सलाह?

क्या कोई समस्या देखने के लिए कोई समस्या है? यह एक अच्छा विचार है? क्या मुझे कुछ हिस्सों को एक साथ चिपकाने के लिए हैक करना होगा?

+0

मेरी सलाह: "नहीं"। ;) –

उत्तर

16

हां, आप अपने स्प्रिंग एमवीसी कोड और आपके हाइबरनेट वर्ग दोनों के लिए स्कैला का उपयोग कर सकते हैं।

@Controller 
class HomeController { 
    val log: Logger = LoggerFactory.getLogger(this.getClass.getName) 

    @RequestMapping(Array("/")) 
    def home: String = { 
    log.debug("HomeController::home") 

    "home/home" 
    } 
} 

और एक हाइबरनेट डोमेन वर्ग का एक उदाहरण:

यहाँ स्काला में एक स्प्रिंग MVC नियंत्रक अपनी परियोजनाओं में से एक से लिया का एक उदाहरण है। वर्ग के उपयोगकर्ताओं के लिए सार्वजनिक स्कैला संग्रह कक्षाओं द्वारा अनुकूलित हाइबरनेट के लिए निजी जावा संग्रह कक्षाओं के उपयोग पर ध्यान दें (स्कैला के जावा कनवर्जन कक्षा द्वारा सहायता)।

@Entity 
class Role { 
    @Id @GeneratedValue 
    var id: Long = _ 

    @Index(name="role_name") 
    var name: String = _ 

    var created_at: Date = _ 
    var updated_at: Date = _ 

    @ManyToMany 
    private var sub_role: java.util.Set[Role] = _ 
    def subRoles: Set[Role] = { 
    if (sub_role == null) sub_role = new java.util.HashSet[Role] 
    sub_role 
    } 

    @ManyToMany 
    private var permission: java.util.Set[Permission] = _ 
    def permissions: Set[Permission] = { 
    if (permission == null) permission = new java.util.HashSet[Permission] 
    permission 
    } 
} 

केवल एक चीज मैं पाया है कि मैं था के लिए (JSR-303 सत्यापन के लिए) @Retention(RUNTIME) एनोटेशन लिख रहा है जावा का उपयोग करने के है।

मैं मिश्रित जावा/स्कैला परियोजनाओं के साथ मेवेन और मेवेन-स्कैला-प्लगइन का उपयोग करता हूं।

+0

क्या स्कैला और वसंत का उपयोग करने के बारे में कोई पुस्तिका है? हां हम स्काला के साथ स्प्रिंग का उपयोग कर सकते हैं, लेकिन बारीकियों के बारे में क्या? – Cherry

+0

क्या ... कृपया इस तरह स्कैला कोड न लिखें। कभी। :( –

+1

क्या आप अधिक विशिष्ट हो सकते हैं? आप स्कैला में हाइबरनेट कोड कैसे लिखेंगे? – sourcedelica

3

आप स्कैला & जावा का उपयोग कर सकते हैं जो भी आपको लगता है कि प्रत्येक के लिए सबसे अच्छा काम करता है।

मुझे पता है कि हाइबरनेट को जावा में होना होगा।

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

यहां तक ​​कि आपका वेब ऐप मॉड्यूल स्कैला में भी लिखा जा सकता है। नियंत्रकों को बस उस अनुबंध का पालन करने की आवश्यकता है जो स्प्रिंग एमवीसी की अपेक्षा करता है।

सामान्य रूप से, जावा में लिखी गई लगभग कुछ भी स्केल में फिर से लिखी जा सकती है। मोटे तौर पर अपवाद हैं लेकिन प्रति-नैतिकता स्वयं को कोशिश करने से सीमित नहीं करती है। मान लें कि आपका मौजूदा कोड पागल (यानी काला-जादू प्रतिबिंब) के लिए कुछ भी नहीं करता है, यह ठीक होना चाहिए।

दिलचस्प यहाँ सवाल ... कैसे Maven के साथ काम कर इसे पाने के लिए है

एक existing SO question जो (मिश्रित स्केला और जावा संसाधनों के साथ बहु मॉड्यूल) परियोजना में काम कर रहे इस तरह की प्राप्त करने के लिए maven-scala-plugin का उपयोग कर का वर्णन करता है । इस समाधान में मैं एकमात्र अतिरिक्त टिप्पणी जोड़ूंगा कि, मेरे अनुभव में, हम केवल जावा स्रोतों पर निर्भर होने वाले स्कैला मॉड्यूल के साथ काम कर सकते हैं, न कि दूसरी तरफ। ऐसा इसलिए था क्योंकि हमारी मेवेन कॉन्फ़िगरेशन ने जावा कंपाइलर और स्कैला कंपाइलर का अलग-अलग उपयोग किया था। सिद्धांत रूप में, स्कैला संकलक जावा फ़ाइलों को भी संकलित कर सकता है, इसलिए यदि आप इसे सब कुछ के लिए एक कंपाइलर का उपयोग करने के लिए कॉन्फ़िगर करते हैं, तो आपको इस सीमा का सामना नहीं करना पड़ेगा।

संपादित करें:

Blankman टिप्पणी की:
@Jesse ताकि आप यह किया है भी तो? यकीन नहीं है कि मैं मेवेन मुद्दा समझ गया।

हां, मैंने दो परियोजनाओं पर काम किया है जिन्होंने मिश्रित जावा और स्कला स्रोतों का उपयोग किया है। हमने हाइबरनेट परत के लिए स्कैला का उपयोग नहीं किया लेकिन हमने बाकी सब कुछ के लिए किया।

मैवेन मुद्दा जो मैं वर्णन कर रहा हूं वह हमारे मैवेन-स्कैला-प्लगइन कॉन्फ़िगरेशन का परिणाम था। आपको अपनी स्कैला फ़ाइलों को संकलित करने के तरीके को जानने के लिए इसे कॉन्फ़िगर करना होगा। हमारे कॉन्फ़िगरेशन (संभवतः सही नहीं) जावा जावा फ़ाइलों को संकलित करने के लिए पहले स्थापित किया गया था, javac का उपयोग करके, और फिर स्केलैक का उपयोग करके स्कैला फ़ाइलों को संकलित करें।इसका मतलब था कि हमें जावा कोड लिखने की इजाजत नहीं थी, जिसने स्कैला कक्षाओं का संदर्भ दिया क्योंकि वे संकलन समय पर उपलब्ध नहीं होंगे। उचित कॉन्फ़िगरेशन के साथ, स्केलैक कंपाइलर का उपयोग अपने सभी स्रोतों को एक साथ संकलित करने के लिए करना चाहिए जो इस अजीब प्रतिबंध को हटा देगा। ऊपर से जुड़े एसओ प्रश्न में उदाहरण कॉन्फ़िगरेशन के साथ-साथ संकलन समय के मुद्दों के बारे में कुछ चर्चा है जिसके बारे में मैं बात कर रहा हूं। यदि आपको प्लगइन सेट अप करने के लिए अधिक संदर्भ की आवश्यकता है, तो आधिकारिक दस्तावेज़ के लिए प्लगइन की वेबसाइट (ऊपर से भी लिंक) देखें।

+2

हाइबरनेट के साथ स्कैला का उपयोग करते समय, आपको यह ध्यान रखना होगा कि आपको स्कैला संग्रह के बजाय 'java.util' संग्रह कक्षाओं का उपयोग करने की आवश्यकता है। – Madoc

+1

@ मैडोक धन्यवाद, यह छोटी चीजें हैं जैसे कि मैं धन्यवाद से सीखने के लिए रोक रहा था! – Blankman

+0

@ जेसे तो आपने यह भी किया है? यकीन नहीं है कि मैं मेवेन मुद्दा समझ गया। – Blankman

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

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