2015-02-06 8 views
7

मैं वसंत डेटा REST 2.1.4 का उपयोग कर रहा हूं। RELEASE।मैं स्प्रिंग डेटा आरईएसटी क्वेरी विधि संसाधन के लिए प्रक्षेपण कैसे लागू करूं?

मैं अपने जुड़ा हुआ संस्थाओं में से कुछ लौटने विस्फोट के लिए

  • एक इकाई Booking,
  • अपनी बाकी भंडार (CrudRepository विस्तार) BookingRepository
  • नाम और एक प्रक्षेपणBookingDetails (@Projection(name="details", types = Booking.class) साथ एनोटेट) बनाया , जैसे Resource, Activity, Applicant आदि

ग्राहक को .../rest/bookings के साथ सभी बुकिंग मिलती है और JSON प्रतिक्रिया में लिंक की गई संस्थाओं के लिंक शामिल होते हैं। यदि यह ?projection=details जोड़ता है तो लिंक की गई इकाइयां विस्फोट और लौट जाती हैं। और यह बहुत अच्छा है।

अब मैं भंडार को यह कस्टम विधि जोड़ें:

List<Booking> findByApplicant(@Param("applicant") Person applicant); 

जब ग्राहक .../rest/bookings/search/findByApplicant?applicant=5 साथ यह आह्वान, वहाँ details प्रक्षेपण अनुरोध का कोई तरीका होने लगते हैं। बाद प्रयास अनदेखी कर रहे हैं:

  • क्वेरी स्ट्रिंग
  • करने के लिए &projection=details जोड़ने बनाने विधि हमेशा BookingDetails वापसी:

    List<BookingDetails> findByApplicant(@Param("applicant") Person applicant); 
    

सारांश, कस्टम खोज विधियों (findBy*) एक वापस कभी नहीं प्रक्षेपण। जब तक आप @RepositoryRestResource(excerptProjection = BookingDetails.class) के साथ रिपॉजिटरी को एनोटेट नहीं करते हैं, लेकिन इससे कुछ समस्याएं होती हैं, तो पहले सभी क्लाइंट को हमेशा एक ही प्रक्षेपण का उपयोग करना होता है। हम उपयोगकर्ता को findBy* विधियों के साथ भी अनुमानों का उपयोग करने की अनुमति कैसे दे सकते हैं?

+1

एक यूआरएल जैसे .../rest/bookings/search/findByApplicant? Applicant = 5' बहुत ही विश्वसनीय नहीं है। '.../आराम/बुकिंग के बारे में क्या? आवेदक = 5'? –

+1

हालांकि यह मूल पोस्टर प्रश्न से पूरी तरह से असंबंधित नहीं है, इस यूआरआई के बारे में क्या अनावश्यक है? सटीक होने के लिए, आप परिभाषा के अनुसार यूआरआई की शांति का न्याय नहीं कर सकते क्योंकि यह पूरी तरह से इस पर निर्भर करता है कि इसके माध्यम से संसाधन संसाधन HTTP अर्थशास्त्र का पालन करता है या नहीं। चाहे संसाधन की आईडी '/ foo' या'/conquer/the/world' पूरी तरह से अप्रासंगिक है। उस ने कहा, स्प्रिंग डेटा आरईएसटी ने ग्राहकों को संसाधनों पर नेविगेट करने के लिए हाइपर्मियाडिया का लाभ उठाया है, इसलिए यदि संसाधनों की आईडी भी कम हो जाती है जो प्रासंगिक नहीं है :)। –

+0

यूआरएल आरपीसी की तरह गंध करता है। बेशक hypermedia एक अच्छी बात है। –

उत्तर

13

मैंने स्प्रिंग डेटा REST 2.2.1 के साथ यह काम करने का सत्यापन किया, इसलिए कृपया इसे अपडेट करें। सुनिश्चित करें कि आपका ग्राहक वास्तव में अनुरोध किए गए पैरामीटर भेजता है जैसा आप चाहते हैं। डीबगिंग करते समय, मुझे पता चला कि उदा। यदि आप यूआरआई को स्पष्ट रूप से उद्धृत नहीं करते हैं तो curl क्वेरी पैरामीटर छोड़ देता है। तो यह:

curl http://localhost:8080/orders/search/findByApplicant?applicant=5&projection=details 

नहीं क्वेरी पैरामीटर के किसी भी भेज देंगे। एक बार जब आप यूआरआई उद्धृत करेंगे, तो यह होगा।

curl 'http://localhost:8080/orders/search/findByApplicant?applicant=5&projection=details' 

यह क्रमशः लोकप्रिय HTTPie के लिए जगह है। इसके साथ आवश्यक वाक्य रचना है:

http :8080/orders/search/findByApplicant applicant==5 projection==details 

मामले में आप इसे इस तरह से काम करने के लिए नहीं मिल सकता है, यह एक चल उदाहरण परियोजना को देखने के लिए प्राप्त करने के लिए शांत हो जाएगा।

+2

बहुत बहुत धन्यवाद! मैं बेवकूफ भरता हूं: मैंने कुछ दिनों पहले स्प्रिंग डेटा आरईएसटी 2.1.4 के साथ इसका परीक्षण किया और काम नहीं किया; तो मैंने 2.2.1 पर अपडेट किया और परीक्षण नहीं किया (मैंने केवल नए 'एक्सेप्टप्रोजेक्शन' का परीक्षण किया)। अब मैं परीक्षण करता हूं .. मुझे लगता है कि यह काम करता है !! मैंने नहीं सोचा था कि इसे अभी लागू किया जा सकता है कि मुझे इसकी आवश्यकता है: डी अब मैं अपना प्रश्न सही करता हूं। समय की बर्बादी के लिए धन्यवाद और खेद है! – bluish

+1

चिंता मत करो। मुझे एक मूर्ख, अनजान 'curl' के साथ बिल्कुल कोई पैरामीटर नहीं देखकर, बेवकूफ महसूस किया। इसके अलावा, इन प्रश्नों को प्राप्त करना अभी भी अच्छा है क्योंकि वे एक ही मुद्दे में चल रहे अन्य लोगों के लिए एक कैनोलिक संदर्भ बन जाते हैं :)। खुशी है कि यह आपके लिए काम करता है! –

+0

हाय, मैं इसी तरह की स्थिति में भाग गया। उपर्युक्त समाधान कस्टम क्वेरी विधियों के लिए काम करता है। लेकिन इनबिल्ट विधियों के लिए प्रक्षेपण कैसे जोड़ें। उदाहरण के लिए, यदि मेरे पास ऑर्डर इकाई है,/ऑर्डर मुझे प्रक्षेपण के साथ सभी ऑर्डर देंगे। लेकिन जब मैं self.href लिंक का उपयोग करके व्यक्तिगत आदेश की खोज करता हूं उदाहरण/ऑर्डर/58fa7da00498e41f81a9f806 के लिए, प्रक्षेपण लागू नहीं होता है। मैं उसे कैसे प्राप्त कर सकता हूं? – pvpkiran

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