具有共享域对象的 Spring Boot MongoDB

Posted

技术标签:

【中文标题】具有共享域对象的 Spring Boot MongoDB【英文标题】:Spring Boot MongoDB with shared Domain Object 【发布时间】:2017-07-17 20:51:18 【问题描述】:

我有 3 个服务(3 个不同的项目,例如 ClientService、AggregationService、DataService)共享相同的域对象,其中只有一个(DataService)连接到 MongoDB 并将数据发送回其他 2 个服务。 所有这些服务都是基于 Spring Boot 的

当我将域对象的单独 java 文件保存在相应项目中时,它一切正常,因为 ClientService 和 AggregationService 中的域对象没有 mongodb 注释,例如 @Document、@Field。

但是当我将域对象保存在一个公共模块中以便我不必维护 3 个副本时,ClientService 和 AggregationService 在启动期间开始抛出异常。尽管这些服务确实启动并正确返回了响应,但是当这些服务启动时也会出现异常。 下面是域对象:

@Document(collection = "transformed_categories")
public class Category extends ResourceSupport 

    @Field("id")
    private String customId;
    private String name;
    private String type;

例外:

2017-02-27 15:10:41.098  INFO 9052 --- [           main] c.c.delivery.CleintServiceApplication     : Started CleintServiceApplication in 3.47 seconds (JVM running for 3.918)
2017-02-27 15:10:41.895  INFO 9052 --- [localhost:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server localhost:27017

com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[mongo-java-driver-3.4.1.jar:na]
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) ~[mongo-java-driver-3.4.1.jar:na]
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113) ~[mongo-java-driver-3.4.1.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05]
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_05]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_05]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) ~[na:1.8.0_05]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_05]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_05]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_05]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_05]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_05]
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:57) ~[mongo-java-driver-3.4.1.jar:na]
at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[mongo-java-driver-3.4.1.jar:na]
... 3 common frames omitted

我找到了导致问题的确切位置。 该问题是由我添加到我打算保留所有域对象的公共库项目中的 maven 依赖项引起的。

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>1.10.0.RELEASE</version>
    </dependency>

如果我删除此依赖项,则异常不会出现。保持跨项目共享的域对象的方法应该是什么?

【问题讨论】:

如果你不需要它就删除它。有什么问题? @Document 注解未在该模块中定义。 你能添加一些配置吗?我想看看这些MongoSocketOpenException: Exception opening socket 是从哪里获取的。我认为这是管理包裹扫描的问题。 【参考方案1】:

这是一篇旧帖子,但需要答案。

首先,微服务不应该共享代码。当有需要跨域发送的对象时,我们应该使用每个微服务都应该拥有的 DTO 模式,并且不应该跨共享代码。 这是推荐的做法。

来到 MongoDB 异常,这是 Spring Boot 应用程序的正常行为。当它在类路径中看到 MongoDB 并且在属性文件中没有配置时,它会在 localhost:27017 中查找 MongoDB 实例 因此,如果我们不打算从微服务连接到 MongoDB,那么 MogoDB 驱动程序不应出现在类路径中。

【讨论】:

以上是关于具有共享域对象的 Spring Boot MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 最简单的解决跨域问题

Spring boot application.properties maven 多模块项目

Java框架spring Boot学习笔记:Bean的作用域

Spring Boot 2中对于CORS跨域访问的快速支持

如何在 Spring Boot 和 RabbitMQ 中配置和接收并将 jSON 有效负载转换为域对象

可以使用域类在Spring Boot项目中实现UserDetails接口[关闭]