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

标签 java spring-mvc docker

当我在 Tomcat 8 Docker 容器中运行 Web 应用程序时,出现 NumberFormatException。当 Spring 尝试实例化 MongoConfig 类时,会发生错误,该类正在注入(inject)从类路径属性文件中获取的 @Values。属性文件中的属性如下:

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 容器的地址(一个单独的 Docker 容器,没有多余的装饰,只是带有 --name mongodb 的 mongodb:latest,然后在 Tomcat 容器的运行中 --linked 作为 mongodb:mongodb命令)。如果您进入正在运行的 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.TypeMismatchException:无法转换类型[java.lang.NumberFormatException]的值。 lang.String] 到所需类型 [int];嵌套异常为 java.lang.NumberFormatException: For input string: "tcp://172.17.0.2:27017""

似乎 mongodb.port 在容器内被覆盖。将端口号更改为 99999 没有任何作用。将属性名称更改为“mylovely.port”然后给我们一个错误,提示端口超出范围,并显示它是 99999。将其修改回 27017 然后给我一个正在运行的 web 应用程序,没有崩溃。剩下的问题是,什么会覆盖这个值以及为什么名为 port 的属性有一个完整的地址? --link 选项是否不仅在 tomcat 容器的/etc/hosts 中设置一个条目,而且还创建某种名为 mongodb 的全局变量或属性,无论后面出现什么,它总是返回完整地址?

最佳答案

Docker sets an environment variable MONGODB_PORT 优先于配置文件。您可以通过检查 (docker inform) 容器来证明这一点,或者,如果它不起作用,可以使用 docker exec 并执行 env 命令来证明这一点在容器内。

更新: 怎么解决呢?第一,read about PropertySource abstraction 。接下来,您将发现环境变量值可以被系统属性覆盖(-Dmongodb.port=27017)。我也尝试 use PropertyOverrideConfigurer但我不确定它是否有效。

关于java - 在 Docker 容器中运行时从属性文件实例化 Spring 配置类时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43896859/

相关文章:

java - 验证 double 值在两个值之间并且 GUI 打开两个 JFrame

java - 如何修复 "HTTP Status 404"Spring MVC

Mysql容器数据持久化、dockerfile疑惑

java - 如果我更改 HashSet 中的对象会怎样?

java - 为什么线程创建的数组会返回空指针异常?

java - 我如何在带有 spring 的 servlet 过滤器中使用 @Transactional 和 sessionFactory bean

spring-mvc - Spring Boot 集成测试 : @AutoConfigureMockMvc and context caching

architecture - 产品版本控制微服务

postgresql - Docker无法启动,卷许可被拒绝错误

JAVA双输入错误(线程 "main"java.lang.NullPointerException中出现异常)