Es fühlt sich an, als wären Sie besser dran, einen benutzerdefinierten Controller zu schreiben, anstatt hier Spring Data REST zu verwenden, da Sie im Grunde zwei Ressourcen benötigen:eine, um einen Link hinzuzufügen oder einen vorhandenen zurückzugeben, und eine zweite, um einen ursprünglichen URI über seinen Hash abzurufen. P>
Bei der ersten Methode rufen Sie einfach eine Repository-Methode findByLongURL(…)
auf und verwenden Sie die erhaltene URL
Beispiel, wenn Sie ein Ergebnis haben, oder einen zweiten Schritt unternehmen, um den Hash tatsächlich zu erstellen und die URL
zu speichern Instanz Gedankenspeicher. Die zweite Ressource würde im Grunde nur Ihre bereits vorhandene Methode aufrufen.
Das ist einfach und leicht zu verdauen.
Wenn Sie möchten, dass die Implementierung der ersteren Methode eine atomare Operation ist, muss die Repository-Abfragemethode manuell implementiert werden (für allgemeine Anweisungen dazu lesen Sie den entsprechenden Abschnitt im Referenzdokumentation ):
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);
}
}
Wie Sie sehen können, müssen Sie sich mit einigen Details auf niedrigerer Ebene befassen (obwohl die Ausführlichkeit durch die Verwendung statischer Importe reduziert werden kann), aber Sie erhalten im Grunde eine atomare Operation.