9

我正在运行一个 Java EE 应用程序,它使用 Hibernate 5.2.10.Final 和 Payara 4.1.1.172 上的 Apache Derby 存储后端。我看到错误消息,例如

Caused by: java.sql.SQLDataException: A truncation error was encountered trying to shrink VARCHAR () FOR BIT DATA '(Binärer Datenwert wird nicht angezeigt)' to length 255.

这表明 Hibernate 或 Derby 或两者都没有在消息的所有部分中使用英文错误消息。

我试过了

  • 添加一个

    static {
        System.setProperty("user.language", "en");
        System.setProperty("user.region", "en_US");
    }
    

    到一个类,但我似乎没有找到一种确定的方法来在任何异常发生之前加载它,我宁愿将设置保留在代码之外。因此同样适用于Locale.setDefault

  • -Duser.language=en如何在 NetBeans 中为 Java EE 项目启用断言server-config

我看到异常消息的开头是英文的。我希望完整的信息是英文的,包括所有可能的部分。我对解决异常不感兴趣,这是一个例子。我不是在寻找消息中德语部分的翻译。

非英语消息部分很可能是由服务器启动的德语 Ubuntu 18.04 引起的。更改操作系统的系统区域设置或服务器可以包装到的容器是一种解决方法,但不是解决方案。

SSCCE 可以在https://gitlab.com/krichter/derby-embedded-data-source-locale-j4ee找到, CI 的示例输出在https://gitlab.com/krichter/derby-embedded-data-源语言环境-j4ee/-/jobs/83525395。SSCCE 仅包含围绕服务器启动的样板文件和一个导致德语错误消息的简单无效本机查询,而不是问题中提供的更多信息。

如果可能,请与 SSCCE 核实答案。

我的动机是有英文异常消息,以便在开发过程中更容易通过搜索引擎找到解决方案,而不会篡改系统语言。

4

2 回答 2

4

为什么不直接使用JAVA_TOOL_OPTIONSenv 变量?设置后export LC_ALL=de_DE.UTF-8(在你的.gitlab-ci.yml)你可以设置export JAVA_TOOL_OPTIONS="-Duser.language=en"享受你的英语错误信息。

关于“-Duser.language”不适用于 derby 的 startNetworkServer:startNetworkServer 是一个执行的脚本(以最简单的形式)java -jar derby.jar。因此,您不能简单地执行bin/startNetworkServer -Duser.language=en. 但是如果你看一下startNetworkServer脚本,你会发现使用了一个环境变量DERBY_OPTS。所以可能它也可以指定export DERBY_OPTS="-Duser.language=en",尽管我没有那样尝试。(正如您的评论所述,事实并非如此

有效的样本.gitlab-ci.yml

main:
    image: ubuntu:18.04
    script:
        - apt-get update && apt-get install --yes language-pack-de wget openjdk-8-jdk maven
        - export LC_ALL=de_DE.UTF-8
        - export JAVA_TOOL_OPTIONS="-Duser.language=en"
        - wget http://www-eu.apache.org/dist//db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.tar.gz && tar xf db-derby-10.14.2.0-bin.tar.gz
        - cd db-derby-10.14.2.0-bin && bin/startNetworkServer &
        - mvn --batch-mode install
        - java -jar target/derby-embedded-data-source-locale-1.0-SNAPSHOT-jar-with-dependencies.jar

输出:

$ java -jar target/derby-embedded-data-source-locale-1.0-SNAPSHOT-jar-with-dependencies.jar
Picked up JAVA_TOOL_OPTIONS: -Duser.language=en
running main
Exception in thread "main" java.sql.SQLNonTransientConnectionException: The connection was refused because the database database was not found.
        at org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Unknown Source)
        at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
        at org.apache.derby.jdbc.ClientDriver.connect(Unknown Source)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
        at de.richtercloud.derby.embedded.data.source.locale.Main.main(Main.java:12)
Caused by: ERROR 08004: The connection was refused because the database database was not found.
        at org.apache.derby.client.net.NetConnectionReply.parseRDBNFNRM(Unknown Source)
        at org.apache.derby.client.net.NetConnectionReply.parseAccessRdbError(Unknown Source)
        at org.apache.derby.client.net.NetConnectionReply.parseACCRDBreply(Unknown Source)
        at org.apache.derby.client.net.NetConnectionReply.readAccessDatabase(Unknown Source)
        at org.apache.derby.client.net.NetConnection.readSecurityCheckAndAccessRdb(Unknown Source)
        at org.apache.derby.client.net.NetConnection.flowSecurityCheckAndAccessRdb(Unknown Source)
        at org.apache.derby.client.net.NetConnection.flowUSRIDPWDconnect(Unknown Source)
        at org.apache.derby.client.net.NetConnection.flowConnect(Unknown Source)
        at org.apache.derby.client.net.NetConnection.<init>(Unknown Source)
        at org.apache.derby.client.net.ClientJDBCObjectFactoryImpl.newNetConnection(Unknown Source)
        ... 4 more
ERROR: Job failed: exit code 1
FATAL: exit code 1
于 2018-07-18T05:50:22.390 回答
0

根据您的描述,Derby 显然忽略了 JVM 的用户语言环境(即使是强制的),而是使用在操作系统级别定义的语言环境。

你说:

Changing the system locale of the OS or a container the server could be wrapped into is a workaround, but not a solution.

我完全理解,但是更改它(使用导出 LC_ALL),而不是在容器上,而只是在启动 Derby 的 shell 脚本中,这不是更可接受的解决方法吗?

于 2018-07-18T07:27:11.653 回答