【问题标题】:Spring MongoRepository, where to catch the exception?Spring MongoRepository,在哪里捕获异常?
【发布时间】: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)

标签: java spring mongodb maven spring-mongodb


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多