【发布时间】: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