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 正在更新或更新插入而不是插入