在 Apache TomEE 中解析 Hazelcast 4.1 XmlClientConfig 失败
Parsing Hazelcast 4.1 XmlClientConfig fails in Apache TomEE
如果应用程序是 Apache TomEE-Plus 8.0.0 中的 运行,则尝试从 XML 构建 Hazelcast 4.1 客户端配置会抛出 IllegalArgumentException。
如果在独立Java VM (AdoptOpenJDK 11.0.5)中执行,则不会出现此问题。
独立测试和 TomEE 使用相同 JDK。
部分堆栈跟踪:
java.lang.IllegalArgumentException: Nicht unterstützt: http://javax.xml.XMLConstants/property/accessExternalDTD
at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)
at com.hazelcast.config.AbstractXmlConfigHelper.schemaValidation(AbstractXmlConfigHelper.java:109)
at com.hazelcast.client.config.XmlClientConfigBuilder.parseAndBuildConfig(XmlClientConfigBuilder.java:175)
at com.hazelcast.client.config.XmlClientConfigBuilder.build(XmlClientConfigBuilder.java:157)
at com.hazelcast.client.config.XmlClientConfigBuilder.build(XmlClientConfigBuilder.java:150)
at com.hazelcast.client.config.XmlClientConfigBuilder.build(XmlClientConfigBuilder.java:145)
...
我在 Whosebug 上发现了一个似乎与我的问题有关的 post:
Set feature accessExternalDTD in TransformerFactory
不幸的是,我不知道答案中的建议解决方案是否为否。 1 确实符合我的问题。
即使是这样,我也不知道如何仅在应用程序代码或配置中应用建议的解决方案,而不更改 Hazelcast 代码内部。
有什么解决办法吗?
Hazelcast 客户端配置 XML:
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast-client xsi:schemaLocation="http://www.hazelcast.com/schema/client-config hazelcast-client-config-4.1.xsd"
xmlns="http://www.hazelcast.com/schema/client-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
</hazelcast-client>
TomEE 版本:
apache-tomee-plus-8.0.0 (Apache Tomcat Version 9.0.22)
Java版本:
AdoptOpenJDK 11.0.5
IMPLEMENTOR="AdoptOpenJDK"
IMPLEMENTOR_VERSION="AdoptOpenJDK"
JAVA_VERSION="11.0.5"
JAVA_VERSION_DATE="2019-10-15"
MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.vm.ci jdk.management jdk.unsupported jdk.internal.vm.compiler jdk.aot jdk.charsets jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.httpserver jdk.internal.ed jdk.internal.le jdk.internal.vm.compiler.management jdk.jdwp.agent jdk.jfr jdk.jsobject jdk.localedata jdk.management.agent jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.pack jdk.scripting.nashorn jdk.scripting.nashorn.shell jdk.sctp jdk.security.auth jdk.security.jgss jdk.xml.dom jdk.zipfs"
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=".:git:7d14fe4b6f30"
这似乎是 XML / DTD 的问题。请检查以下配置文件
https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/resources/hazelcast-client-default.xml
和代码
public ClientConfig clientConfig() throws Exception {
return new XmlClientConfigBuilder("hazelcast-client.xml").build();
}
这看起来像 this issue which is due to the presence of an old JAXP implementation in the classpath. This is fixed in Hazelcast 4.1.1 (fix pull request) 通过提供系统 属性 开关来避免无法打开 XXE 保护时失败。
您应该能够在 Apache TomEE 中启动 Hazelcast 客户端,方法是升级到 Hazelcast 4.1.1 并设置系统 属性 hazelcast.ignoreXxeProtectionFailures=true
(例如,通过向 Apache TomEE 提供 -Dhazelcast.ignoreXxeProtectionFailures=true
java
启动命令行)。
如果应用程序是 Apache TomEE-Plus 8.0.0 中的 运行,则尝试从 XML 构建 Hazelcast 4.1 客户端配置会抛出 IllegalArgumentException。
如果在独立Java VM (AdoptOpenJDK 11.0.5)中执行,则不会出现此问题。
独立测试和 TomEE 使用相同 JDK。
部分堆栈跟踪:
java.lang.IllegalArgumentException: Nicht unterstützt: http://javax.xml.XMLConstants/property/accessExternalDTD
at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)
at com.hazelcast.config.AbstractXmlConfigHelper.schemaValidation(AbstractXmlConfigHelper.java:109)
at com.hazelcast.client.config.XmlClientConfigBuilder.parseAndBuildConfig(XmlClientConfigBuilder.java:175)
at com.hazelcast.client.config.XmlClientConfigBuilder.build(XmlClientConfigBuilder.java:157)
at com.hazelcast.client.config.XmlClientConfigBuilder.build(XmlClientConfigBuilder.java:150)
at com.hazelcast.client.config.XmlClientConfigBuilder.build(XmlClientConfigBuilder.java:145)
...
我在 Whosebug 上发现了一个似乎与我的问题有关的 post: Set feature accessExternalDTD in TransformerFactory 不幸的是,我不知道答案中的建议解决方案是否为否。 1 确实符合我的问题。 即使是这样,我也不知道如何仅在应用程序代码或配置中应用建议的解决方案,而不更改 Hazelcast 代码内部。
有什么解决办法吗?
Hazelcast 客户端配置 XML:
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast-client xsi:schemaLocation="http://www.hazelcast.com/schema/client-config hazelcast-client-config-4.1.xsd"
xmlns="http://www.hazelcast.com/schema/client-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
</hazelcast-client>
TomEE 版本:
apache-tomee-plus-8.0.0 (Apache Tomcat Version 9.0.22)
Java版本:
AdoptOpenJDK 11.0.5
IMPLEMENTOR="AdoptOpenJDK"
IMPLEMENTOR_VERSION="AdoptOpenJDK"
JAVA_VERSION="11.0.5"
JAVA_VERSION_DATE="2019-10-15"
MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.vm.ci jdk.management jdk.unsupported jdk.internal.vm.compiler jdk.aot jdk.charsets jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.httpserver jdk.internal.ed jdk.internal.le jdk.internal.vm.compiler.management jdk.jdwp.agent jdk.jfr jdk.jsobject jdk.localedata jdk.management.agent jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.pack jdk.scripting.nashorn jdk.scripting.nashorn.shell jdk.sctp jdk.security.auth jdk.security.jgss jdk.xml.dom jdk.zipfs"
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=".:git:7d14fe4b6f30"
这似乎是 XML / DTD 的问题。请检查以下配置文件 https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/resources/hazelcast-client-default.xml 和代码
public ClientConfig clientConfig() throws Exception {
return new XmlClientConfigBuilder("hazelcast-client.xml").build();
}
这看起来像 this issue which is due to the presence of an old JAXP implementation in the classpath. This is fixed in Hazelcast 4.1.1 (fix pull request) 通过提供系统 属性 开关来避免无法打开 XXE 保护时失败。
您应该能够在 Apache TomEE 中启动 Hazelcast 客户端,方法是升级到 Hazelcast 4.1.1 并设置系统 属性 hazelcast.ignoreXxeProtectionFailures=true
(例如,通过向 Apache TomEE 提供 -Dhazelcast.ignoreXxeProtectionFailures=true
java
启动命令行)。