基本的に2つのリソースが必要なため、ここではSpring Data RESTを使用する代わりに、カスタムコントローラーを作成する方がよいと思われます。1つはリンクを追加するか既存のリソースを返すためのもので、もう1つはハッシュを介して元のURIを取得するためのものです。
最初のメソッドでは、リポジトリメソッドfindByLongURL(…)
を呼び出すだけです。 取得したURL
を使用します たとえば、結果が得られた場合、または2番目の手順を実行して実際にハッシュを作成し、URL
を保存する場合 インスタンス思考リポジトリ。 2番目のリソースは、基本的に既存のメソッドを呼び出すだけです。
それは簡単で消化しやすいです。
前者のメソッドの実装がアトミック操作である必要がある場合は、リポジトリクエリメソッドを手動で実装する必要があります(一般的な手順については、リファレンスドキュメント ):
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);
}
}
ご覧のとおり、これにはいくつかの低レベルの詳細の処理が含まれますが(ただし、静的インポートを使用することで冗長性を減らすことができます)、基本的には不可分操作を提供します。