在Apache TomEE中解析Hazelcast 4.1 XmlClientConfig失败

在Apache TomEE中解析Hazelcast 4.1 XmlClientConfig失败,hazelcast,Hazelcast,如果应用程序运行在Apache TomEE Plus 8.0.0中,尝试从XML构建Hazelcast 4.1客户端配置会引发IllegalArgumentException 如果在独立Java VM(采用OpenJDK 11.0.5)中执行,则不会出现问题 独立测试和TOME使用相同的JDK 堆栈跟踪的一部分: java.lang.IllegalArgumentException: Nicht unterstützt: http://javax.xml.XMLConstants/propert

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

如果在独立Java VM(采用OpenJDK 11.0.5)中执行,则不会出现问题

独立测试和TOME使用相同的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上找到一篇帖子,似乎与我的问题有关: 不幸的是,我不知道答案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>
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的一个问题。请检查以下配置文件 和代码

这似乎是由于类路径中存在旧的JAXP实现。在Hazelcast 4.1.1()中,通过提供系统属性开关解决了这一问题,以避免在XXE保护无法打开时出现故障


您应该能够在Apache TomEE中启动Hazelcast客户端,方法是升级到Hazelcast 4.1.1并设置系统属性
Hazelcast.IgnoreXXProtectionFailures=true
(例如,向Apache TomEE的
java
启动命令行提供
-Dhazelcast.IgnoreXXProtectionFailures=true
)这不是Hazelcast的建议。我认为由于过时的xml解析器而禁用保护功能不应该是这个问题的推荐解决方案!
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"
public ClientConfig clientConfig() throws Exception {
  return new XmlClientConfigBuilder("hazelcast-client.xml").build();
}