Có vẻ như bạn nên viết một bộ điều khiển tùy chỉnh thay vì sử dụng Spring Data REST ở đây vì về cơ bản bạn cần hai tài nguyên:một tài nguyên để thêm liên kết hoặc trả lại tài nguyên hiện có và tài nguyên thứ hai để truy xuất URI gốc thông qua băm của nó.
Trong phương thức đầu tiên, bạn chỉ cần gọi một phương thức lưu trữ findByLongURL(…)
và sử dụng URL
thu được ví dụ nếu bạn có kết quả hoặc thực hiện bước thứ hai để thực sự tạo hàm băm và lưu URL
kho lưu trữ tư tưởng ví dụ. Tài nguyên thứ hai về cơ bản sẽ chỉ gọi cho bạn phương thức đã tồn tại.
Điều đó dễ hiểu và dễ hiểu.
Nếu bạn cần việc triển khai phương pháp cũ là một hoạt động nguyên tử, phương thức truy vấn kho lưu trữ cần được triển khai thủ công (để biết hướng dẫn chung về cách này, hãy đọc phần có liên quan trong tài liệu tham khảo ):
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);
}
}
Như bạn có thể thấy, điều này liên quan đến việc xử lý một số chi tiết cấp thấp hơn (mặc dù độ chi tiết có thể được giảm bớt bằng cách sử dụng nhập tĩnh) nhưng về cơ bản cung cấp cho bạn một hoạt động nguyên tử.