Zdá se, že je lepší napsat si vlastní řadič namísto používání Spring Data REST zde, protože v podstatě potřebujete dva zdroje:jeden pro přidání odkazu nebo vrácení existujícího a druhý pro načtení původního URI prostřednictvím jeho hash.
V první metodě byste jednoduše zavolali metodu úložiště findByLongURL(…)
a použijte získanou URL
například, pokud máte výsledek nebo udělejte druhý krok, abyste skutečně vytvořili hash a uložili URL
úložiště instancí myšlenek. Druhý zdroj by vám v podstatě jen zavolal již existující metodu.
To je přímočaré a snadno stravitelné.
Pokud potřebujete, aby implementace předchozí metody byla atomická operace, je třeba metodu dotazu na úložiště implementovat ručně (obecné pokyny k tomu si přečtěte v příslušné části v referenční dokumentace ):
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 můžete vidět, zahrnuje to práci s některými detaily nižší úrovně (ačkoli výřečnost lze snížit použitím statických importů), ale v podstatě vám to dává atomickou operaci.