Изглежда, че е по-добре да напишете персонализиран контролер, вместо да използвате Spring Data REST тук, тъй като основно се нуждаете от два ресурса:един за добавяне на връзка или връщане на съществуващ и втори за извличане на оригинален URI чрез неговия хеш.
В първия метод просто бихте извикали метод на хранилище 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);
}
}
Както можете да видите, това включва работа с някои детайли от по-ниско ниво (въпреки че подробността може да бъде намалена чрез използване на статични импортирания), но основно ви дава атомарна операция.