java - 使用 REST API 进行后端事务

标签 java spring rest transactions

我对 REST API 以及如何在我们的应用程序中创建一些后端事务有疑问。 我们有一个会计应用程序,因此对于创建的每笔交易都有一个分类帐条目。 (尽管客户端 - javascript 不知道此类条目)

例如,在 REST 中,我们通过 -

POST /transactions/

(或)

POST /accounts/1223/transactions/

现在,当我在 RestController 中处理这个问题时, 我想做以下事情 -

  • 基于 POST 创建事务。
  • 在后端创建分类帐条目。 (客户端 - javascript 应该不知道)
  • 更新帐户上的余额条目。 (客户端 - javascript 应该不知道)

在 spring java 应用程序中的 TransactionService 中(但这应该无关紧要,因为我的问题集中在 REST API 语义上),

@Transactional
public void saveTransaction(Transaction t) {
    transactionRepo.save(t);
    Ledger l = new Ledger(<particulars>)();
    ledgerRepo.save(l);
    Balance b = balanceService.get(<partiulars>);
    balanceRepo.update(b);
}
  1. 我对 REST API 方法感到困惑,因为它们只更新 资源。更新资源不会改变应用程序中的其他底层细节吗?
  2. 阅读有关 REST 的内容时,会对事务原子性感到困惑 解决了。在 REST 中此类 Activity 的解决方案是什么?
  3. 我无法使用多阶段方法(首先保存交易,然后使用交易 ID 创建分类账等)从客户端 (javascript) 执行这些多重保存,因为客户端应用程序应该不知道此类后端服务相关操作.

有人可以清楚地解释在这种特定情况下如何处理吗?

许多应用程序都与财务和会计相关,但我只是不明白为什么 REST 不适合这种实际场景。可能是我的理解不同吧。

最佳答案

when I deal with this in RestController, I want to do the following -

  • Create the Transaction based on POST.
  • Create a ledger entry in the back-end. (Client - javascript should be unaware)
  • Update the balance entry on the account. (Client - javascript should be unaware)

这一切看起来都很合理。

I am confused with the REST API approach as they only update the resource.

所以我的诊断是你是 semantic diffusion 的受害者;在您学习 REST 之前,它的含义发生了多大变化?

您的最佳起点可能是 Jim Webber's 2011 talk

You have to learn how to use HTTP to trigger business activity as a side effect of moving documents around the network.

HTTP 告诉您请求的语义是什么——这就是 REST 所说的“统一接口(interface)”——但它没有说明任何有关副作用的信息。事实上,在您的域中,您通过更新分类帐和余额来响应 POST 请求,这是很好

如果有帮助的话:这与网站的工作方式完全相同。您填写表格并提交,一些网页(资源)因此发生变化,后端也发生了很多有趣的事情。

关于java - 使用 REST API 进行后端事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57680964/

相关文章:

java - 修改接口(interface)的多个类,一个设计问题

java - 如何在返回对象的 Spring MVC @RestController @ResponseBody 类中响应 HTTP 状态代码?

java - 在 java 中对 ArrayList<Integer> 的数组进行排序

rest - PUT 的 HTTP 状态代码

java - 如何从 Firestore 获取数组内的映射值?

java - 如何使用 post 方法将文件上传到 spring mvc RestController

Spring Web Flux Reactive + Server Sent Events = 无限循环?

java - Spring 验证: get single (relevent) validation message for multiple constraints

javascript - 使用第三方 OAuth2 服务将 SPA/REST 应用程序的 refresh_token 存储在哪里?

java - 如何将 REST Web 服务部署到 AWS?