2015-01-02 7 views
6

के साथ स्प्रिंग हैटियोस Restservice उपभोग करने के लिए मेरे पास दो अनुप्रयोग हैं, एक को बार कहा जाता है, जो मुझे एचएएल प्रारूप में संसाधन प्रदान करता है। दूसरा उस सेवा का उपभोग करने के लिए बीसीएम है।RestTemplate

प्रतिक्रिया बार का उदाहरण इस प्रकार है:

[ 
    { 
     "name":"Brenner/in", 
     "_links":{ 
      "self":{ 
       "href":"..host/bbsng-app-rest/betrieb/15" 
      } 
     } 
    }, 
    { 
     "name":"Dienstleistungshelfer/in HW", 
     "_links":{ 
      "self":{ 
       "href":"..host/bbsng-app-rest/betrieb/4" 
      } 
     } 
    }, 
    { 
     ... 

अब मैं उपभोग करने के लिए कि बीसीएम स्प्रिंग RestTemplate का उपयोग करने से प्रयास करें। मेरा समाधान काम करता है, लेकिन मैं किसी भी तरह से उस समाधान से खुश नहीं हूं और मुझे लगता है कि एक और साफ तरीका है।

मेरा ग्राहक-संहिता लेने वाली RestService लगता है:

@Autowired private RestTemplate template; 

@Override 
@SuppressWarnings("unchecked") 
public BerufListe findeAlleBerufe() { 
    final BerufListe berufListe = new BerufListe(); 

    final ResponseEntity<List> entity = template.getForEntity(LinkUtils.findBeruf(), List.class); 

    if (OK.equals(entity.getStatusCode())) { 
     final List<LinkedHashMap> body = entity.getBody(); 
     for (final LinkedHashMap map : body) { 
      final LinkedHashMap idMap = (LinkedHashMap) map.get("_links"); 
      String id = remove(String.valueOf(idMap.get("self")), "href="); 
      id = remove(id, "{"); 
      id = remove(id, "}"); 
      final String name = String.valueOf(map.get("name")); 
      final Beruf beruf = new Beruf(id, name); 
      berufListe.add(beruf); 
     } 
    } 

    return berufListe; 
} 

जैसा कि आप देख रहे कुछ बदसूरत कोड हैं। उनमें से एक यह है कि मेरे पास मेरे संग्रह के लिए कोई जेनरिक नहीं है। दूसरी बात, मुझे Resource_ID बहुत जटिल मिलता है, और मैं स्वयं url निकालने के लिए कई बार StringUtils.remove का उपयोग करता हूं।

मुझे यकीन है कि वसंत द्वारा एचएएल-प्रतिक्रिया का उपभोग करने के लिए एक और सुविधाजनक तरीका होना चाहिए।

धन्यवाद।

उत्तर

3

वसंत-नफरत से Resource कक्षा को देखें।

यह प्रतिक्रिया से लिंक निकालने के तरीके प्रदान करता है। हालांकि, RestTemplate के रूप में आपको कक्षा को चर के रूप में प्रदान करने की आवश्यकता है, मुझे वांछित इकाई के उप-वर्ग बनाने के अलावा अलग-अलग तरीके नहीं मिला है और इसे RestTemplate के लिए उपयोग किया गया है।

आप कोड तो ऐसा दिखाई दे सकता:

public class BerufResource extends Resource<Beruf> { } 

BerufResource resource = template.getForEntity("http://example.at/berufe/1", BerufResource.class); 
Beruf beruf = resource.getContent(); 
// do something with the entity 

आप एक पूरी सूची का अनुरोध करना चाहते हैं, तो आप RestTemplate करने के लिए अपने इकाई की सरणी संस्करण पारित करने के लिए की आवश्यकता होगी:

BerufResource[] resources = template.getForEntity("http://example.at/berufe", BerufResource[].class); 

List<BerufResource> berufResources = Arrays.asList(resources); 
for(BerufResource resource : berufResources) { 
    Beruf beruf = resource.getContent(); 
} 

दुर्भाग्य से , हम Resource<Beruf>.class नहीं लिख सकते जो सामान्य वर्ग के पूरे उद्देश्य को हरा देता है, क्योंकि हमें फिर से प्रत्येक इकाई के लिए उप-वर्ग बनाना होगा। इसके पीछे कारण टाइप एरर कहा जाता है। मैंने कहीं पढ़ा है कि वे RestTemplate के लिए सामान्य समर्थन पेश करने की योजना बना रहे हैं लेकिन मुझे किसी भी विवरण से अवगत नहीं है।

URL से ID की निकासी को संबोधित करते:

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

{ 
    "firstname": "Thomas", 
    "nachname": "Maier", 
    "profession": "http://example.at/professions/1" 
} 
+0

किसी भी अद्यतन: एक ठेठ बाद अनुरोध ऐसा दिखाई दे सकता? दुर्भाग्यवश – Snekse

+0

नहीं। लेकिन तब से मैंने बहुत अधिक शोध नहीं किया है। –

+2

सबक्लासिंग से बचने के लिए आप 'नया पैरामीटरेट टाइप टाइपरेंस <संसाधन >() {} 'का उपयोग कर सकते हैं। – afaulconbridge

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