【问题标题】:umlauts not working when running spring app in docker container在docker容器中运行spring应用程序时变音符号不起作用
【发布时间】:2023-03-27 19:56:01
【问题描述】:

我在服务中有这个测试代码:

import io.r2dbc.postgresql.codec.Json

// ...

logger.info("test")
val x = "{\"x\": \"ü\"}"
logger.info(x)

val typeRef = object : TypeReference<LinkedHashMap<String, String>>() {}

val xParsed = objectMapper.readValue(x, typeRef)
if (xParsed["x"] == "ü") {
  logger.info("parsed ue correctly")
} else {
  logger.info("converted ue incorrect")
}

val xJ = Json.of(x)
val xConverted = objectMapper.readValue(xJ.asString(), typeRef)
logger.info(xConverted["x"])
if (xConverted["x"] == "ü") {
  logger.info("converted ue correctly")
} else {
  logger.info("converted ue incorrect")
}

从 IDE 运行时,它按预期工作。这是日志输出:

2021-08-11 14:21:16.237  INFO 25810 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : test
2021-08-11 14:21:16.237  INFO 25810 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : {"x": "ü"}
2021-08-11 14:21:16.237  INFO 25810 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : parsed ue correctly
2021-08-11 14:21:16.238  INFO 25810 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : ü
2021-08-11 14:21:16.238  INFO 25810 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : converted ue correctly

当我在使用./gradlew bootBuildImage 构建映像后从 docker 容器中运行它时,容器的输出是:

backend_1  | 2021-08-11 12:25:28.905  INFO 9 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : test
backend_1  | 2021-08-11 12:25:28.905  INFO 9 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : {"x": "?"}
backend_1  | 2021-08-11 12:25:28.906  INFO 9 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : parsed ue correctly
backend_1  | 2021-08-11 12:25:28.906  INFO 9 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : ??
backend_1  | 2021-08-11 12:25:28.906  INFO 9 --- [tor-tcp-epoll-1] some.feature.serviceImpl      : converted ue incorrect

如日志所示,第一部分很好,但在Json 转换后,变音变音变了。为什么以及如何解决这个问题?

【问题讨论】:

    标签: spring-boot docker spring-data-r2dbc


    【解决方案1】:

    结果证明将环境变量 JAVA_OPTS 设置为 -Dfile.encoding=UTF8 可以修复它。但是我仍然不明白为什么其他不使用手动 json 转换的服务可以正常工作。

    例如在docker-compose.yml

      my_service:
        image: the_image
        ports:
          - 8080:8080
        environment:
          JAVA_OPTS: "-Dfile.encoding=UTF8"
    

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 2015-05-13
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      相关资源
      最近更新 更多