ऐसा लगता है कि आप यहां स्प्रिंग डेटा आरईएसटी का उपयोग करने के बजाय एक कस्टम नियंत्रक लिखना बेहतर समझते हैं क्योंकि आपको मूल रूप से दो संसाधनों की आवश्यकता होती है:एक लिंक जोड़ने के लिए या किसी मौजूदा को वापस करने के लिए और दूसरा हैश के माध्यम से मूल यूआरआई पुनर्प्राप्त करने के लिए।पी>
पहली विधि में आप केवल एक रिपॉजिटरी विधि को कॉल करेंगे findByLongURL(…)
और प्राप्त URL
. का उपयोग करें उदाहरण के लिए यदि आपके पास कोई परिणाम है या वास्तव में हैश बनाने के लिए दूसरा कदम उठाते हैं और URL
को सहेजते हैं उदाहरण विचार भंडार। दूसरा संसाधन मूल रूप से आपको पहले से मौजूद विधि कहेगा।
यह सीधा और पचाने में आसान है।
यदि आपको पूर्व विधि के कार्यान्वयन की आवश्यकता है, तो एक परमाणु ऑपरेशन होना चाहिए, रिपॉजिटरी क्वेरी विधि को मैन्युअल रूप से लागू करने की आवश्यकता होती है (उस पर सामान्य निर्देशों के लिए संबंधित अनुभाग को संदर्भ दस्तावेज़ीकरण ):
class UrlRepositoryImpl implements UrlRepositoryCustom {
private final MongoOperations operations;
public UrlRepositoryImpl(MongoOperations operations) {
this.operations = operations;
}
@Override
public URL findOrInsert(String source) {
// What to find?
Query query = Query.query(Criteria.where("longURL").is(source);
// What to write if nothing can be found
Update update = new Update()
.setOnInsert("longURL", source)
.setOnInsert("hash", calculatedHash);
FindAndModifyOptions options = new FindAndModifyOptions.options()
.returnNew(true) // returns the document insert (if so)
.upsert(true); // insert document if it doesn't exist
return operations.findAndModify(query, update, options, URL.class);
}
}
जैसा कि आप देख सकते हैं कि इसमें कुछ निचले स्तर के विवरणों से निपटना शामिल है (हालाँकि स्थैतिक आयात का उपयोग करके वर्बोसिटी को कम किया जा सकता है) लेकिन मूल रूप से आपको एक परमाणु संचालन देता है।