java - 如何在Fabric8 Open Jdk Container中启用扩展编码?

标签 java docker java-11 quarkus fabric8

我在 fabric8/java-alpine-openjdk11-jre:1.6.5 中遇到 UnmappableCharacterException容器。我该如何解决这个异常?

java.nio.charset.UnmappableCharacterException: Input length = 1
    at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:275)
    at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:306)
    at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:281)
    at java.base/sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)

应用程序上下文:

我的应用程序是带有 Quarkus Framework 的 Web api 应用程序,基本上我使用 UTF-8 编码,但在某些时候我需要使用其他编码,如 MS932 (Windows-31j) .

当我在机器上运行应用程序时(不是在容器中,使用 ./gradlew quarkusDev ),我可以使用这些特定编码获得响应,但在容器中,我遇到了上述异常。

最近我将框架 Jersey 更改为 Quarkus 和 tomcat:8.5-jdk11-openjdk-slim容器至fabric8/java-alpine-openjdk11-jre:1.6.5容器。

我确信 Jersey 带有 tomcat:8.5-jdk11-openjdk-slim回复无一异常(exception),所以稍后我会尝试使用openjdk11-slim镜像,但我喜欢fabric8的容器,所以我想修复这个问题并继续使用它。

检测到的结果:

我尝试将这些特定编码更改为 UTF-8UTF-16 ,响应都可以,但不仅仅是 MS932 ,还有SJIS , GBK及其他Extended Encoding Set返回异常。

在这种情况下,我猜这些异常与 Extended Encoding Set 有关。和fabric8的容器镜像。

环境信息和 Dockerfile:

这是我的 Dockerfile 的一部分(它基于 Quarkus 生成的 Dockerfile):

FROM fabric8/java-alpine-openjdk11-jre:1.6.5
ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV AB_ENABLED=jmx_exporter

# Be prepared for running in OpenShift too
RUN adduser -G root --no-create-home --disabled-password 1001 \
  && chown -R 1001 /deployments \
  && chmod -R "g+rwX" /deployments \
  && chown -R 1001:root /deployments

COPY --from=build /home/gradle/project/build/lib/* /deployments/lib/
COPY --from=build /home/gradle/project/build/*-runner.jar /deployments/app.jar
EXPOSE 8080

# run with user 1001
USER 1001
  • 操作系统:Debian GNU/Linux 10
  • Docker 版本:18.09.1

引用文献

最佳答案

我们找到了解决方案。

不幸的是,这不是 Quarkus、Fabric8 和 Java 的问题,而只是数据(字符)的问题。

最近数据更新了。它包含一些 MS932 或其他编码无法显示但 UTF-8 可以显示的字符。结果就导致了这个问题。

虽然很尴尬,但问题已经解决了。

关于java - 如何在Fabric8 Open Jdk Container中启用扩展编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60444807/

相关文章:

java - 我创建了一个表,但在向其中插入值时出错

java - 在 Eclipse 中自动添加适当的异常处理

java - JPA:删除级联上多个实体的内容

docker - docker私有(private)注册表是否有默认端口

java - 由于 IllegalAccessException,Clojure 无法在 Java 11 上调用接口(interface)默认方法

java - : "Uploading function code to Lambda" javax/xml/bind/JAXBException 期间发生内部错误

docker - spring cloud hystrix 涡轮机 amqp 连接被 docker 拒绝

从 WildFly8/jdk8 迁移到 WildFly14/jdk11 后,WebService 客户端中出现 java.net.SocketTimeoutException

Flutter : Android Gradle plugin requires Java 11 to run. 您当前使用的是 Java 1.8

bash - 使用RUN命令在Docker中执行Shell脚本