मैं कुछ ऐसा करने की कोशिश कर रहा हूं जो मुझे लगता है कि वास्तव में सरल होना चाहिए। मेरे पास Question
ऑब्जेक्ट है, वसंत-बूट, वसंत-डेटा-आराम और वसंत-नफरत के साथ सेटअप। सभी मूल बातें ठीक काम करती हैं। मैं एक कस्टम नियंत्रक जोड़ना चाहता हूं जो List<Question>
को उसी प्रारूप में देता है जो मेरे Repository
के /questions
यूआरएल को प्राप्त करता है, ताकि दोनों के बीच प्रतिक्रिया संगत हो।क्या मैं एक कस्टम नियंत्रक स्प्रिंग-डेटा-रेस्ट/स्प्रिंग-हेटोएस जेनरेटेड क्लास के स्वरूपण को दर्पण कर सकता हूं?
@Controller
public class QuestionListController {
@Autowired private QuestionRepository questionRepository;
@Autowired private PagedResourcesAssembler<Question> pagedResourcesAssembler;
@Autowired private QuestionResourceAssembler questionResourceAssembler;
@RequestMapping(
value = "/api/questions/filter", method = RequestMethod.GET,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody PagedResources<QuestionResource> filter(
@RequestParam(value = "filter", required = false) String filter,
Pageable p) {
// Using queryDSL here to get a paged list of Questions
Page<Question> page =
questionRepository.findAll(
QuestionPredicate.findWithFilter(filter), p);
// Option 1 - default resource assembler
return pagedResourcesAssembler.toResource(page);
// Option 2 - custom resource assembler
return pagedResourcesAssembler.toResource(page, questionResourceAssembler);
}
}
विकल्प 1::
यहाँ मेरी नियंत्रक है प्रदान की SimplePagedResourceAssembler
इस विकल्प के साथ समस्या यह आवश्यक _links
में से कोई भी गाया जाता है पर भरोसा। यदि इसके लिए कोई फिक्स था, तो यह सबसे आसान समाधान होगा।
विकल्प 2: लागू मेरी खुला संसाधन कोडांतरक
इस विकल्प के साथ समस्या यह है कि Spring-Hateoas documentation के अनुसार QuestionResourceAssembler
को लागू करने के लिए एक रास्ता नीचे की ओर जाता है, जहां QuestionResource
Question
की एक लगभग डुप्लिकेट होने समाप्त होता है, और उसके बाद है असेंबलर को दो ऑब्जेक्ट्स के बीच डेटा मैन्युअल रूप से कॉपी करने की आवश्यकता होती है, और मुझे हाथ से सभी प्रासंगिक _links
बनाने की आवश्यकता है। यह बहुत बर्बाद प्रयास की तरह लगता है।
क्या करना है?
मुझे पता है कि स्प्रिंग ने QuestionRepository
निर्यात करते समय यह सब करने के लिए कोड पहले से ही जेनरेट किया है। क्या कोई तरीका है कि मैं उस कोड में टैप कर सकता हूं और इसका उपयोग कर सकता हूं, यह सुनिश्चित करने के लिए कि मेरे नियंत्रक से आउटपुट निर्बाध प्रतिक्रियाओं के साथ निर्बाध और विनिमयशील है?
ज़रूर स्प्रिंग की तरह लगता है यह एक बहुत आसान बना दिया है हो सकता है: अब आप कि एक
PersistentEntityResourceAssembler
अपने @RepositoryRestController अंदर के साथ क्या कर सकते हैं। क्या यह तथ्य नहीं है कि आपको अपने स्वयं के लिंक जोड़ना है, फिर भी संभावित रूप से अलग-अलग एपीआई (जैसे आपने कहीं और बताया) का नेतृत्व किया है? और क्या आपको हर जगह पेजों का उपयोग करना है? जब मैं सिर्फ एक सूची <संसाधन> वापस करने का प्रयास करता हूं> मुझे द्वि-दिशात्मक हाइबरनेट मैपिंग के कारण रिकर्सन मिलता है। इसलिए मुझे या तो @ जेसन इग्नोर जोड़ना है या इसके बजाय एक पेजेड रिसोर्सएस्सेबलर का उपयोग करना है। –
gyoder
मुझे लगता है कि आप किसी भी समय एक से अधिक ऑब्जेक्ट्स को वापस लौट रहे हैं, केवल सुरक्षा के लिए, आप किसी भी ऑब्जेक्ट को वापस लौट रहे हैं। निश्चित रूप से यह बहुत आसान हो सकता है, लेकिन यदि आप स्प्रिंग के स्वयं के लिंकबिल्डर पर भरोसा करते हैं तो आप वास्तव में एक अलग एपीआई के साथ समाप्त नहीं होते हैं। यह संभव है कि आप उपयोगी गंतव्यों के लिंक के साथ समाप्त न हों, लेकिन जब से प्रासंगिक है, तो नियंत्रक तक यह कुछ समझ में आता है। इसका असली वसंत शायद ऑब्जेक्ट प्रकार के आधार पर उपयोगी लिंक प्रदान कर सकता है। – JBCP
2016 में, नियंत्रक/कस्टम भंडार का उपयोग करते समय वसंत-डेटा-आराम एस्क्यू व्यवहार प्राप्त करने के लिए यह अभी भी सबसे अच्छा/एकमात्र तरीका है? यह काफी परेशान है। – Casey