2015-10-08 7 views
8

मेरे पास वर्तमान में स्प्रिंग नियंत्रक और थाइमेलीफ का उपयोग करके एक छोटा ब्राउज़र ऐप बनाने के लिए एक प्रोजेक्ट है। नियंत्रक वर्ग के रूप मेंस्प्रिंग एमवीसी, थाइमेलीफ और आरईएसटी

@Controller public class MyController { 

नियंत्रक के अंदर मैं एक GET के रूप में परिभाषित

@RequestMapping(value = "/foobars", method = RequestMethod.GET) 
String index(Model model, --- more params ---) { 
    //call repository and get foobarsList 
    //model.addAttribute("foobars", foobarsList); 
      ... 
    return "foobars/foobarThymeleafTemplate" 
} 

कॉल भंडार है और foobarList के रूप में परिभाषित एक MongoRepository के लिए एक कॉल प्राप्त घोषित किया जाता है:

public interface FoobarRepository extends MongoRepository< ... cut for brevity> { 

    @RestResource(rel = "by-id") 
    Marker findMarkerById(String id); 

    ... additional @RestResources cut for brevity ... 
} 

फिर से, ब्र owser ऐप बहुत अच्छा लग रहा है। प्राप्त करें भंडार को कॉल करता है, मॉडल को फ़ूबार्स और थाइमेलीफ की सूची के साथ उस सूची के साथ काम करता है।

समस्या: अब मैं एक एंड्रॉयड App से है कि एक ही डेटा का उपयोग करने की जरूरत है और मैं बाकी का उपयोग करना पसंद करेंगे और सिर्फ Android एप्लिकेशन में JSON खपत करते हैं। मैं थाइमेलीफ रखना चाहता हूं लेकिन यदि आवश्यक हो तो ब्राउज़र ऐप को दोबारा बदल देगा।

प्रश्न: वहाँ एक रास्ता किसी भी तरह एक ही @Controller उपयोग करने के लिए या मैं/restFoobars अंतिम बिंदुओं के साथ @RestController का उपयोग कर एक दूसरे FoobarRestController बनाए रखने के लिए होगा है? दूसरा आरईएसटी नियंत्रक निश्चित रूप से काम करता है लेकिन ऐसा लगता है कि यह खराब है ... खराब डिजाइन।

आपके विचार और सिफारिशें?

फिर से धन्यवाद। रिच

उत्तर

1

मेरे पसंदीदा यहाँ दृष्टिकोण विरासत उपयोग करने के लिए है: अगर वहाँ महत्वपूर्ण कार्य आदानों या की तरह जाँच किया जाना है,

@RequestMapping('/foobars') 
abstract class FoobarBaseController { 

    @RequestMapping 
    abstract listAll() 
} 

@Controller 
class FoobarHtmlController extends FoobarBaseController { 
    @Override ModelAndView listAll() { 
     new ModelAndView('foobars/foobarThymeleafTemplate', [foobars: foobarsList]) 
    } 
} 

@RestController 
@RequestMapping('/foobars', produces = MediaType.APPLICATION_JSON_VALUE) 
class FoobarJsonController extends FoobarBaseController { 
    @Override Collection<Foobar> listAll() { 
     foobarsList 
    } 
} 

वैकल्पिक रूप से, आप BaseController में लागू कर सकते हैं कि और एक abstract listAllResponse(DomainObject foo) है फिर उपयुक्त ModelAndView (HTML) या डीटीओ (JSON) लौटाता है।

इस दृष्टिकोण का एक ख़तरा है कि आप @RequestMapping का कोई हिस्सा ओवरराइड कर सकते हैं नहीं है, तो आप जब आप produces पैरामीटर निर्दिष्ट मानचित्रण के वर्ग की ओर से दोहराना है, लेकिन आप विधि-स्तर के वारिस कर सकते हैं बिना किसी समस्या के मैपिंग्स।

1

बेनकाब Crud

उपयोग @Controller HTML पृष्ठ से निपटने और रिपोजिटरी के प्रयोग आप SPRING-DATA-REST का उपयोग कर अपने संस्थाओं का पर्दाफाश करने के द्वारा crud जैसे बुनियादी कार्यों के लिए बाकी एपीआई के माध्यम से इकाई का पर्दाफाश कर सकते हैं काम करने के लिए। मुझे लगता है कि आप पहले से ही कोड

@RestResource(rel = "by-id") 
    Marker findMarkerById(String id); 

व्यापार तर्क

बेनकाब आप किसी भी व्यापार तर्क को बेनकाब करना चाहते हैं को देखकर यह क्या कर रहे हैं, तो आप एक Service परत बना सकते हैं और बस के माध्यम से यह कॉल करने के लिए अपने वेब पेज के लिए @Controller।और वेब एपीआई इंटरफ़ेस के लिए @RestController के रूप में एक और नियंत्रक बनाएं।

आप ध्यान दें, आप यहां किसी भी कोड को डुप्लिकेट नहीं कर रहे हैं, क्योंकि सेवा परत में एक बिंदु पर तर्क लिखा गया है। लेकिन विभिन्न प्रयोजनों के लिए विभिन्न नियंत्रकों का उपयोग करना। यदि आप app.web और app.api के रूप में अपने कोड नाम स्थान सकते हैं

आप वेब पेज में सभी तर्क की जरूरत नहीं है के रूप में एपीआई के संपर्क में आया, बाकी के लिए अलग नियंत्रक के उपयोग के अपने कोड के लिए एक साफ डिजाइन कार्यान्वयन हो सकता है।

सोचा

वेब पृष्ठों और एंड्रॉयड के लिए एक पूर्ण REST API का क्रियान्वयन का उपयोग के लिए खाद्य। फिर HTML5 के साथ क्लाइंट साइड कार्यान्वयन करने के लिए AngualarJS या backboneJs का उपयोग करें। मुझे लगता है कि यह भविष्य है।

+0

घटनाक्रम आपने दो साल पहले उत्तर दिया था, और मैं बैक एंड के लिए एक पूर्ण आराम एपीआई का उपयोग करने के लिए सहमत हूं और फिर फ्रंट एंड के लिए जावास्क्रिप्ट ढांचे का उपयोग करना तर्कसंगत रूप से होना चाहिए कि समुदाय को किसके लिए प्रयास करना चाहिए, हालांकि अभी भी कोई प्रश्न नहीं है स्टैक ओवरफ्लो पर और अभी भी लगभग कोई दस्तावेज या ट्यूटोरियल यह कैसे करें, या तो जावा समुदाय बदलने के लिए बहुत प्रतिरोधी है, या यह लंबे समय तक अच्छी तरह से काम नहीं करता है, आपको क्या लगता है? –

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