Wydaje się, że lepiej jest napisać niestandardowy kontroler zamiast używać Spring Data REST tutaj, ponieważ zasadniczo potrzebujesz dwóch zasobów:jednego do dodania linku lub zwrócenia istniejącego, a drugiego do pobrania oryginalnego identyfikatora URI za pomocą jego skrótu.
W pierwszej metodzie wystarczy wywołać metodę repozytorium findByLongURL(…)
i użyj uzyskanego URL
wystąpienie, jeśli masz wynik lub wykonasz drugi krok, aby faktycznie utworzyć skrót i zapisać URL
repozytorium myśli instancji. Drugi zasób po prostu wywołałby już istniejącą metodę.
To proste i łatwe do strawienia.
Jeśli potrzebujesz implementacji poprzedniej metody jako operacji atomowej, metoda zapytania repozytorium musi być zaimplementowana ręcznie (ogólne instrukcje na ten temat znajdziesz w odpowiedniej sekcji w dokumentacja referencyjna ):
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);
}
}
Jak widać, wymaga to radzenia sobie z niektórymi szczegółami niższego poziomu (chociaż szczegółowość można zmniejszyć za pomocą importów statycznych), ale w zasadzie daje to działanie atomowe.