Det känns som att du är bättre att skriva en anpassad kontroller istället för att använda Spring Data REST här eftersom du i princip behöver två resurser:en för att lägga till en länk eller returnera en befintlig och en andra för att hämta en original URI via dess hash.
I den första metoden skulle du helt enkelt anropa en lagringsmetod findByLongURL(…)
och använd den erhållna URL
exempel om du har ett resultat eller tar ett andra steg för att faktiskt skapa hashen och spara URL
instans tankeförråd. Den andra resursen skulle i princip bara kalla dig redan befintlig metod.
Det är enkelt och lätt att smälta.
Om du behöver implementera den förra metoden vara en atomoperation måste förvarsfrågemetoden implementeras manuellt (för allmänna instruktioner om det läs upp det relevanta avsnittet i referensdokumentation ):
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 handlar det om att hantera vissa detaljer på lägre nivå (även om utförligheten kan minskas genom att använda statisk import) men ger dig i princip en atomär operation.