在Apache TomEE中解析Hazelcast 4.1 XmlClientConfig失败



如果应用程序在Apache TomEE Plus 8.0.0中运行,则尝试从XML构建Hazelcast 4.1客户端配置会引发IllegalArgumentException。

如果在独立的Java虚拟机(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)
...

我在StackOverflow上发现了一篇似乎与我的问题有关的帖子:在TransformerFactory中设置功能访问ExternalDTD不幸的是,我不知道答案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"

这看起来像是由于类路径中存在旧的JAXP实现引起的问题。Hazelcast 4.1.1(修复拉取请求(中通过提供系统属性开关来解决这一问题,以避免XXE保护无法打开时出现故障。

通过升级到Hazelcast 4.1.1并设置系统属性hazelcast.ignoreXxeProtectionFailures=true(例如,通过向Apache TomEE的java启动命令行提供-Dhazelcast.ignoreXxeProtectionFailures=true(,您应该能够在Apache TomEE中启动Hazelccast客户端。

这似乎是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();
}

您可以从esapi依赖项中排除xercesImpl和xalan。

<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.3.0.0</version>
<exclusions>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
<exclusion>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
</exclusion>
</exclusions>
</dependency>

最新更新