Spring MongoRepository,在哪里捕获异常?

Posted

技术标签:

【中文标题】Spring MongoRepository,在哪里捕获异常?【英文标题】:Spring MongoRepository, where to catch the exception? 【发布时间】:2018-04-03 19:08:18 【问题描述】:

我有一个 Spring 项目和一个 MongoRepository。 MongoRepository 是一个扩展 MongoRepository 的接口,就像 JPA 一样。

如果我尝试使用mvn clean install 构建我的项目,它会运行一次 Spring。 Spring 尝试连接到未在我的 Jenkins 服务器上运行的 MongoDB。

exception=com.mongodb.MongoSocketOpenException: 异常打开套接字,由 java.net.ConnectException: Connection denied: connect引起

有没有办法捕获异常?我无法在调用存储库的服务上捕获它,因为没有执行这些方法。我认为这与@autowire 有关,但我不知道如何捕获异常。

架构:

application
  - resource (api)
  - service
  - repository extends MongoRepository

应用程序扫描项目,资源调用服务,服务调用存储库,存储库因为无法连接MongoDB而抛出错误。

存储库:

public interface MetingRepository extends MongoRepository<Meting, String> 
    Page<Meting> findAllByRuimteId(String ruimteId, Pageable page);

服务:

@Service("metingenService")
public class MetingServiceImpl implements MetingService 

  // could I try-catch this?
  @Autowired
  private MetingRepository metingRepository;

    @Override
    public Meting addMeting(Meting meting) 
      // try-catch does not solve the issue here
      return metingRepository.save(meting);
    
  

我唯一的测试,自动生成:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MetingenServiceApplicationTests 

    @Test
    public void contextLoads() 

    


堆栈跟踪:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“metingResource”的bean时出错:通过字段“metingService”表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为 'metingenService' 的 bean 时出错:通过字段 'metingRepository' 表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“metingRepository”的 bean 时出错:设置 bean 属性“mongoOperations”时无法解析对 bean“mongoTemplate”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class] 中定义名称为“mongoTemplate”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.mongodb.core.MongoTemplate]:工厂方法 'mongoTemplate' 抛出异常;嵌套异常是 org.springframework.dao.DataAccessResourceFailureException: 在等待与 WritableServerSelector 匹配的服务器时超时 30000 毫秒。集群状态的客户端视图是 type=UNKNOWN, servers=[address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception=com.mongodb.MongoSocketOpenException: Exception opening socket, 由 java.net. ConnectException:连接被拒绝:连接];嵌套异常是 com.mongodb.MongoTimeoutException: 在等待与 WritableServerSelector 匹配的服务器时超时 30000 毫秒。集群状态的客户端视图是 type=UNKNOWN, servers=[address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception=com.mongodb.MongoSocketOpenException: Exception opening socket, 由 java.net. ConnectException:连接被拒绝:连接]

【问题讨论】:

如果你想选择性地自动装配这个 repo,你可以使用 @Autowired(required = false) @Noixes 即使 required=false,mvn package 也会运行存储库并尝试连接。我迷路了,因为据我所知,我无法捕捉到这些异常 为什么mongodb服务无法访问? 当你说“它运行一次spring”时......你的意思是你有一个由构建触发的单元测试?您需要向我们展示这个单元测试,其中(取决于您在其中做什么)您需要模拟外部依赖项。 MetingenServiceApplicationTests 的目的是什么?在大多数情况下,您不应该使用SpringBootTests。为什么不是没有 Spring Context 的简单 junit? @RunWith(JUnit4.class)@RunWith(MockitoJUnitRunner.class) 【参考方案1】:

您的单元测试正在尝试加载完整的 Spring 上下文。因此,它试图加载一个有效的MongoTemplate 以连接到一个 MongoDB 实例。

在大多数情况下,您不应该使用@SpringBootTests(用于集成测试),而是可以进行正常的 JUnit 测试:

@RunWith(JUnit4.class) // or @RunWith(MockitoJUnitRunner.class)
public class MetingenServiceApplicationTests 
    ...

【讨论】:

以上是关于Spring MongoRepository,在哪里捕获异常?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data 的 MongoTemplate 和 MongoRepository 有啥区别?

如何在使用带有 Spring 数据的 MongoRepository 的查询注释时显示查询

使用Spring Data Mongodb的MongoRepository类进行增删改查

Spring MongoRepository 正在更新或更新插入而不是插入

使用 Spring Data MongoRepository 进行更新查询的自定义方法

Spring Data MongoRepository 的 in 查询操作