Det føles som om, du er bedre stillet til at skrive en brugerdefineret controller i stedet for at bruge Spring Data REST her, da du grundlæggende har brug for to ressourcer:en til at tilføje et link eller returnere en eksisterende og en anden til at hente en original URI via dens hash.
I den første metode ville du blot kalde en lagermetode findByLongURL(…)
og brug den opnåede URL
eksempel hvis du har et resultat eller tager et andet skridt til rent faktisk at oprette hashen og gemme URL
instans tankedepot. Den anden ressource ville stort set bare kalde dig allerede eksisterende metode.
Det er ligetil og let at fordøje.
Hvis du har brug for, at implementeringen af den førstnævnte metode skal være en atomoperation, skal repository-forespørgselsmetoden implementeres manuelt (for generelle instruktioner om det, læs det relevante afsnit i referencedokumentation ):
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);
}
}
Som du kan se, involverer dette håndtering af nogle detaljer på lavere niveau (selvom omfanget kan reduceres ved at bruge statisk import), men det giver dig grundlæggende en atomart operation.