如何在 Fabric8 Open Jdk Container 中启用扩展编码?
How to enable extended encodings in Fabric8 Open Jdk Container?
我在 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 框架的网络 api 应用程序,基本上我使用的是 UTF-8 编码,但在某些时候我需要使用其他编码,例如 MS932 (Windows-31j)
.
当我 运行 机器上的应用程序(不在容器中,使用 ./gradlew quarkusDev
)时,我可以用这些特定的编码得到我的响应,但在容器中,我有以上例外。
最近我将 Jersey 框架更改为 Quarkus,并将 tomcat:8.5-jdk11-openjdk-slim
容器更改为 fabric8/java-alpine-openjdk11-jre:1.6.5
容器。
我确定带有tomcat:8.5-jdk11-openjdk-slim
的Jersey毫无例外地响应,所以我稍后会尝试使用openjdk11-slim图像,但我喜欢fabric8的容器,所以我想修复这个问题并继续使用它。
检测到的结果:
我尝试将这些特定编码更改为UTF-8
或UTF-16
,响应都可以,但不仅是MS932
,还有SJIS
、GBK
等 Extended Encoding Set return 例外。
在这种情况下,我猜想这些异常与 Extended Encoding Set
和 fabric8 的容器镜像有关。
环境信息和Docker文件:
这是我的 Docker 文件的一部分(它基于 Quarkus 生成的 Docker 文件):
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
- OS: Debian GNU/Linux 10
- Docker版本:18.09.1
参考资料
我们找到了解决方案。
不幸的是,这不是 Quarkus、Fabric8 和 Java 的问题,它只是数据(字符)。
最近更新了数据。它包含一些 MS932
或其他编码无法显示但 UTF-8
可以显示的字符。结果造成了这个问题。
尴尬,不过问题已经解决了。
我在 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 框架的网络 api 应用程序,基本上我使用的是 UTF-8 编码,但在某些时候我需要使用其他编码,例如 MS932 (Windows-31j)
.
当我 运行 机器上的应用程序(不在容器中,使用 ./gradlew quarkusDev
)时,我可以用这些特定的编码得到我的响应,但在容器中,我有以上例外。
最近我将 Jersey 框架更改为 Quarkus,并将 tomcat:8.5-jdk11-openjdk-slim
容器更改为 fabric8/java-alpine-openjdk11-jre:1.6.5
容器。
我确定带有tomcat:8.5-jdk11-openjdk-slim
的Jersey毫无例外地响应,所以我稍后会尝试使用openjdk11-slim图像,但我喜欢fabric8的容器,所以我想修复这个问题并继续使用它。
检测到的结果:
我尝试将这些特定编码更改为UTF-8
或UTF-16
,响应都可以,但不仅是MS932
,还有SJIS
、GBK
等 Extended Encoding Set return 例外。
在这种情况下,我猜想这些异常与 Extended Encoding Set
和 fabric8 的容器镜像有关。
环境信息和Docker文件:
这是我的 Docker 文件的一部分(它基于 Quarkus 生成的 Docker 文件):
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
- OS: Debian GNU/Linux 10
- Docker版本:18.09.1
参考资料
我们找到了解决方案。
不幸的是,这不是 Quarkus、Fabric8 和 Java 的问题,它只是数据(字符)。
最近更新了数据。它包含一些 MS932
或其他编码无法显示但 UTF-8
可以显示的字符。结果造成了这个问题。
尴尬,不过问题已经解决了。