当您 return 一个特定的 spring bean 给任何休息端点的消费者时会发生什么

What happens when you return a particular spring bean to any consumer of a rest endpoint

我有一个包含多个 spring 引导模块的项目。我们的数据层不是更简单、更典型的 CRUD 和模型对象查找器的情况,与我们的数据交互的服务需要更多的配置和元数据知识。如果我有一个模块整合了对其他几个模块很重要的配置,并且如果我将这些实例注册为 spring beans,那么如果我将它们从 rest 端点返回给消费者会发生什么?例如,假设这些对象之一是自定义 MongoRepository 实现。返回的实例会起作用吗?如果两个模块调用端点来请求实例,那么当它们在消费者模块中被反序列化时,这些实例是否可以正常运行?如果消费者与托管其余端点的服务位于不同的 JVM 上,是否存在差异?

当我们考虑模型对象由休息控制器发送并由消费者接收时会发生什么时,我不确定答案是否像看起来那么简单。存储库包括与数据库的已建立连接,该连接可能是也可能不是 SSL。对于身份验证和授权之类的东西,这种方法似乎不可行,但我想我会问这个问题以确保我真正理解这一点。我正在权衡这种方法与将此模块创建为库 (jar),我可以将其包含在需要此配置的模块中。不过,我怀疑我只能使用 jar/library 方法来做到这一点。

您不应该通过您的(Rest)端点将存储库、服务、数据源等基础设施 bean 公开为资源。那只会导致(奇怪的)问题。

例如,如果您公开 MongoRepository 并且它会被序列化(通过 java Serialization),为什么它应该在我的计算机上运行?我与 MongoDB 没有联系,我什至可能没有,甚至可能不关心。想象一下 JpaRepository 连接到企业级数据库服务器(如 Oracle 或 DB2)的情况。我绝对不会拥有那个,也不会拥有所有模式和数据。

因此,根据经验,不要通过(其余)端点公开这些服务。

你的(rest)端点应该只公开模型而不是基础设施(或应用程序)相关的 bean。