Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Docker容器中运行时,从属性文件实例化Spring配置类时出错_Java_Spring Mvc_Docker - Fatal编程技术网

Java 在Docker容器中运行时,从属性文件实例化Spring配置类时出错

Java 在Docker容器中运行时,从属性文件实例化Spring配置类时出错,java,spring-mvc,docker,Java,Spring Mvc,Docker,当我在Tomcat 8 Docker容器中运行我的webapp时,我得到了一个NumberFormatException。当Spring尝试实例化MongoConfig类时会发生错误,该类正在注入从类路径属性文件获取的@value。属性文件中的属性如下所示: mongodb.host=mongodb mongodb.database=mydatabase mongodb.port=27017 mongodb.username=myusername mongodb.password=mypassw

当我在Tomcat 8 Docker容器中运行我的webapp时,我得到了一个NumberFormatException。当Spring尝试实例化MongoConfig类时会发生错误,该类正在注入从类路径属性文件获取的@value。属性文件中的属性如下所示:

mongodb.host=mongodb
mongodb.database=mydatabase
mongodb.port=27017
mongodb.username=myusername
mongodb.password=mypassword
在MongoConfig文件中,当它到达这一点时,它会出现NumberFormatException:

@Value("${mongodb.port}")
private int port;
根据错误,它正在恢复tcp://172.17.0.2:27017 作为它试图插入端口的输入,尽管属性文件明确给出了端口,但没有任何其他内容,如IP地址。它获取的IP地址是它分配给mongodb容器的IP地址—一个单独的Docker容器,没有虚饰,只有mongodb:latest和-name mongodb,然后在Tomcat容器的run命令中链接为mongodb:mongodb。如果您将shell放入正在运行的Tomcat容器中并查看/etc/hosts,您将看到mongodb的条目,并且它似乎可以从Tomcat容器中访问

为什么Spring会选择整个tcp地址,包括IP和端口,而在属性文件中它自己被赋予了端口?我该如何处理这件事

更新-错误是:创建名为“com.mydomain.myproject.config.MongoConfig”的bean时出错:通过字段“port”表示的依赖关系未得到满足:未能将[java.lang.String]类型的值转换为所需的[int]类型;嵌套异常为java.lang.NumberFormatException:对于输入字符串:tcp://172.17.0.2:27017; 嵌套异常为org.springframework.beans.typemischException:未能将[java.lang.String]类型的值转换为所需的[int]类型;嵌套异常为java.lang.NumberFormatException:对于输入字符串:tcp://172.17.0.2:27017

似乎mongodb.port正在容器中被重写。将端口号更改为99999没有任何作用。将属性名称更改为mylovely.port后,我们收到一个错误,抱怨端口超出范围,并显示为99999。将其修改回27017,然后给了我一个运行的webapp,没有崩溃。剩下的问题是,是什么覆盖了这个值&为什么称为port的属性有一个完整的地址?是不是-link选项不仅在tomcat容器的/etc/hosts中设置了一个条目,而且还创建了一种称为mongodb的全局变量或属性,它总是返回完整的地址?

mongodb\u端口,优先于配置文件。您可以通过检查docker inspect容器来证明这一点,或者,如果它不起作用,可以使用docker exec并在容器中执行env命令

更新:
如何解决?第一接下来,您将发现环境变量值可以被系统属性-Dmongodb.port=27017覆盖。我也会尝试,但我不确定它是否会起作用。

谢谢斯拉瓦!我来看看。很高兴知道我没有发疯-嗯,我在这里没看到。这就是我检查Tomcat容器时发生的情况:docker inspect 685e73f706f5 | grep-I端口绑定:{HostPort:8080 PublishAllPorts:false,ExposedPorts:{Ports:{},不要忘记在docker exec期间链接容器…这是我从MongoDB容器中得到的:docker inspect MongoDB | grep-I端口绑定:{HostPort:27017 PublishAllPorts:false,ExposedPorts:{Ports:{主机端口:27017BTW是Spring启动应用程序吗?