Sembra che tu stia meglio scrivendo un controller personalizzato invece di utilizzare Spring Data REST qui poiché hai sostanzialmente bisogno di due risorse:una per aggiungere un collegamento o restituire un esistente e una seconda per recuperare un URI originale tramite il suo hash.
Nel primo metodo dovresti semplicemente chiamare un metodo di repository findByLongURL(…)
e usa l'URL
ottenuto esempio se hai un risultato o esegui un secondo passaggio per creare effettivamente l'hash e salvare l'URL
repository di pensiero di istanza. La seconda risorsa ti chiamerebbe fondamentalmente un metodo già esistente.
È semplice e facile da digerire.
Se è necessario che l'implementazione del primo metodo sia un'operazione atomica, il metodo di query del repository deve essere implementato manualmente (per istruzioni generali su questo leggere la sezione pertinente in documentazione di riferimento ):
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);
}
}
Come puoi vedere, ciò comporta la gestione di alcuni dettagli di livello inferiore (sebbene la verbosità può essere ridotta utilizzando importazioni statiche), ma sostanzialmente ti dà un'operazione atomica.