2012-01-16 7 views
5

हमारे पास एक जावा सर्वर वेब एप्लिकेशन है जहां सिस्टम के मूल में एक बहुत ही जटिल डोमेन मॉडल होता है जिसे डोमेन संचालित डिज़ाइन के सिद्धांतों के अनुसार डिज़ाइन किया गया था। अधिकांश भाग के लिए, इन डोमेन ऑब्जेक्ट्स अन्य चिंताओं के अनुप्रयोगों से बहुत कम प्रभावित हुए हैं।एक्सएमएल में हैटओएएस के लिए लिंक संबंधों को कैसे कार्यान्वित करना सबसे अच्छा है?

अब हम सिस्टम के सामने एक आरईएसटी वेब सेवा एपीआई डालने की सोच रहे हैं और मैं अपने नए मीडिया प्रकार के भीतर आने वाले हेटोएस लिंक को सर्वोत्तम तरीके से कार्यान्वित करने के तरीके से संघर्ष कर रहा हूं। उदाहरण के लिए, मान लीजिए कि हम डोमेन वर्ग foo JAX-बी एनोटेशन के साथ एक आईडी और नाम गुण है कि है:

@XmlType(name = "foo") 
public class FooImpl implements Foo { 

    private String name; 
    private String id; 

    ...snip.... 

@XmlID 
@XmlAttribute 
@Override 
public String getId() { 
    return id; 
} 

    @XmlElement 
    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(final String name) { 
     this.name = name; 
    } 
} 

लेकिन एक्सएमएल मैं इस तरह दिखता लौटना चाहते:

<foo id="123" href="http://myserver.com/foos/123"> 
    <name>myFoo</name> 
    <links> 
      <link rel="previous" href="http://myserver.com/foos/122" type="application/mything+xml" /> 
      <link rel="next" href="http://myserver.com/foos/124" type="application/mything+xml" /> 
      <link rel="edit" href="http://myserver.com/foos/123" type="application/mything+xml" /> 
      <link rel="revise" href="http://myserver.com/foos/123" method="put" type="application/mything+xml" /> 
      <link rel="cancel" href="http://myserver.com/foos/123?op="cancel"" method="post" type="application/mything+xml" /> 
    </links> 
</foo> 

क्या है ऐसा करने का सबसे अच्छा तरीका है कि मैंने इन मीडिया प्रकार के लिंक के साथ अपने डोमेन डिज़ाइन को प्रदूषित नहीं किया है, लेकिन एक्सएमएल मार्शलिंग के लिए अभी भी जेएक्स-बी की शक्ति का उपयोग कर सकते हैं? यहाँ कुछ विचार कर रहे हैं:

1) JAX-बी एडेप्टर - मैं इन इस्तेमाल कर सकते हैं संस्थाओं के लिए एक्सएमएल को संशोधित करने और links..is यह संभव डालने के लिए? क्या यह उचित है? कोई उदाहरण?

2) डीटीओ लेयर - एक नई आरईएसटी सेवा परत बनाएं जो डीटीओ में मेरी डोमेन ऑब्जेक्ट्स को परिवर्तित करती है। अब तक हम डीटीओ की परेशानी से बचने में सक्षम हैं। हालांकि यह ग्राहक के पास वापस आने में कुल लचीलापन प्रदान करेगा, मैं यहां डोमेन अज्ञेयवादी क्लाइंट बनाने की भी तलाश नहीं कर रहा हूं।

3) लिंक हेडर - मुझे वास्तव में यह विचार पसंद है, लेकिन मुझे नहीं लगता कि यह काम करेगा (स्वयं ही) क्योंकि कभी-कभी हमारे संसाधनों में उप-संसाधनों का संग्रह होता है। इस मामले में उप-स्रोतों को अभी भी एक्सएमएल में मार्शल किया जाना चाहिए जिसमें लिंक/hrefs इत्यादि शामिल हों। इसलिए लिंक हेडर समस्या को शीर्ष स्तर के प्रकार में हल करते हैं, लेकिन यह पूरी समस्या को हल नहीं करता है। अन्यथा कहने के लिए स्वतंत्र महसूस करें!

क्या कोई अन्य दृष्टिकोण है जो मुझे डीटीओ से बचने में मदद करेगा और फिर भी डोमेन मॉडल के लिए पारदर्शी रहेगा?

+0

मॉडल के लिंक जोड़ने से आपके डोमेन कक्षाओं को विस्तारित करने की आवश्यकता होती है लेकिन फिर आपकी डीएओ परत ऐसी वस्तुओं को तुरंत चालू नहीं कर सकती है। एकत्रीकरण पर विचार करें और उस परत पर जेएक्सबी (या जो भी एक्सएमएल मैपिंग) जोड़ना। –

+0

यदि मैं समझता हूं, तो एक आरईएसटी मॉडल बनाएं जो डोमेन ऑब्जेक्ट को लिंक के साथ जोड़ता है और उसे भेजता है। एक डीटीओ की तरह, लेकिन लिंक शामिल करने के लिए डोमेन को विस्तारित करने की तरह। क्या मैं समझता हूँ? – HDave

+2

हां, मैं रैपर बनाउंगा। यदि आवश्यक हो, तो डीएओ वस्तुओं को कॉल का प्रतिनिधि। तो मूल रूप से यह है कि [सजावटी डिजाइन पैटर्न] (http://en.wikipedia.org/wiki/Decorator_pattern)। –

उत्तर

2

समस्या यह है कि लिंक को सही ढंग से उत्पन्न करने के लिए उन संदर्भों को जानने की आवश्यकता होती है, जिनके भीतर वे उत्पन्न होते जा रहे हैं, जिसका अर्थ है कि सरल जेएक्सबी इंटरसेप्टर नौकरी नहीं करेंगे: वे आसानी से नहीं जानते कि कौन सी यूआरएल डालने के लिए है। और क्या है, अगले और पिछले लिंक उत्पन्न करने के लिए यह जानने की आवश्यकता होगी कि वे मान क्या हैं; यह संभवतः यह कहना सुरक्षित नहीं है कि वे लगातार हैं, क्योंकि इससे कुछ अन्य संसाधन हटा दिए जाने पर संसाधन यूआरएल को बदल देगा, जो पागलपन होगा।

सबसे सुरक्षित, सबसे आसान तरीका एक रैपर वर्ग (जेएक्सबी क्रमबद्धता एनोटेशन के साथ) होने जा रहा है जो डीएओ परत को आवश्यक जानकारी के लिए प्रतिनिधि करता है। हालांकि यह लिखने के लिए उचित मात्रा में कोड हो सकता है, लेकिन इस तरह के कोड को सही से कम करना आसान है। फैंसी स्वचालित सजावट बहुत कठिन हो जाएगा।

0

RESTEasy परमाणु या हेडर लिंक के माध्यम से लिंक के लिए समर्थन है। कुछ अतिरिक्त एनोटेशन हैं जिनके द्वारा आप लिंक की गई सेवाओं को इंगित कर सकते हैं। RESTEasy दस्तावेज़ीकरण के अध्याय 8 देखें।