项目通过Maven管理,已配置Mongodb连接,测试dao接口报错

项目是通过Maven的,我想从Mongodb数据库里面查询出来存进去的数据,然后做单元测试DAO接口,一直报错拒绝连接。

本地测试,可以访问Mongodb,使用 navicat 测试连接也没有问题。

img

img

DAO接口

public interface BannerDao {

    List<Banner> getBanners();
}

DAO实现类

@Repository
public class BannerDaoImpl implements BannerDao {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 查询数据
     * @return
     */
    public List<Banner> getBanners() {
        Date now = new Date();
        Query query = Query.query(
                Criteria.where("beginTime").lt(now)
                        .and("endTime").gt(now)
        );

        return  mongoTemplate.find(query,Banner.class);
    }
}


单元测试类


@SpringBootTest(classes = {LivegoodsBannerApp.class})
@RunWith(SpringRunner.class)
public class TestDao {

    @Autowired
    private BannerDao bannerDao;

    @Test
    public void testSelect(){
        List<Banner> banners = bannerDao.getBanners();
        for (Banner b : banners){
            System.out.println(b);
        }
    }

}

demo_banner的pom-xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
        <artifactId>demo</artifactId>
        <groupId>com.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo_banner</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.demo</groupId>
            <artifactId>demo_mongodb</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

</project>

另一个子项目demo_mongodb配置文件如下:application-mongodb.yml

spring:
  data:
    mongodb:
      host: 192.168.1.10
      port: 27017
      username: admin
      password: admin
      authentication-database: admin
      database: livegoods

demo_mongodb的pom-xml


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>demo</artifactId>
        <groupId>com.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo_mongodb</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>
</project>

run testDao报错信息如下:

org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused: connect}}]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused: connect}}]

    at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:88)
    at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2874)
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:2799)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2518)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2500)
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:856)
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:842)
    at com.livegoods.banner.dao.impl.BannerDaoImpl.getBanners(BannerDaoImpl.java:37)
    at com.livegoods.banner.dao.impl.BannerDaoImpl$$FastClassBySpringCGLIB$$127a1d05.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
    at com.livegoods.banner.dao.impl.BannerDaoImpl$$EnhancerBySpringCGLIB$$5c04f349.getBanners(<generated>)
    at com.livegoods.test.dao.TestDao.testSelect(TestDao.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
    at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused: connect}}]
    at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:177)
    at com.mongodb.internal.connection.SingleServerCluster.getDescription(SingleServerCluster.java:41)
    at com.mongodb.client.internal.MongoClientDelegate.getConnectedClusterDescription(MongoClientDelegate.java:147)
    at com.mongodb.client.internal.MongoClientDelegate.createClientSession(MongoClientDelegate.java:98)
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.getClientSession(MongoClientDelegate.java:278)
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:182)
    at com.mongodb.client.internal.MongoIterableImpl.execute(MongoIterableImpl.java:135)
    at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:92)
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:2782)
    ... 49 more

一开始是无法访问到,后面通过配置开放防火墙端口,并将mongodb配置文件添加成任何IP都可以访问,但运行后还是无法查询到数据库的数据,显示连接超时,拒绝连接什么的。

我想测试DAO接口,看是否能查询出数据库里面的轮播图的图片路径、开始时间、过期时间这些的。不知道是哪里出错了,希望能帮忙看下是什么原因。

type配置错误,type=UNKNOWN

上述问题已解决好了,现在写下问题的原因和解决办法:
连接不上Mongodb数据库的原因是:**套娃 vm装centos 装 docker 再装 MongoDB **,并且vm虚拟机的网络使用的桥接模式,导致一个问题 jar报解析连接时候 本地找不到 连接 centos centos 再找路由到 docker 才能拿到,套的层级太深了,使用navicat可以连接,但是项目连接不了 。无法指定ip访问mongodb导致项目访问不到DAO总是报错。 这个涉及到计算机网络问题,我也不太明白 。
可以使用Git,做一下单体测试,测试没问题后写入项目:thread successfully connected to server with description ServerDescription{address=192.168.1.10:27017, type=ST
解决方案:在banner的maven子项目中将配置文件application.yml,改成下方的这种形式。

livegoods:
  banner:
    nginx:
      server: http://192.168.1.10:8888/
spring:
  data:
    mongodb:
#      换下数据库
      uri: mongodb://admin:admin@192.168.1.10:27017/livegoods?authSource=admin
  application:
    name: livegoods-banner
    profiles:
      active: mongo
server:
  port: 9000
eureka:
  instance:
    prefer-ip-address: true # 使用ip注册,不使用主机名注册
  client:
    service-url:
      defaultZone: http://192.168.1.10:8761/eureka


若是有遇到以上问题的,可以参考一下,我简直就是自己坑自己
一开始以为是自己的Mongodb配置文件写错了,或者是防火墙端口没有开启、mongodb的配置文件没改成任何IP访问,但是这些都解决好了,还是报错。大坑啊!