java 由“FEATURE_SECURE_PROCESSING”设置的限制

um6iljoc  于 2023-02-18  发布在  Java
关注(0)|答案(4)|浏览(433)

我在java中使用了我自己的xlst转换器(XSLTTransformator),但是转换非常大,我得到了错误:

Caused by: javax.xml.transform.TransformerConfigurationException: JAXP0801002: the compiler encountered an XPath expression containing '107' operators that exceeds the '100' limit set by 'FEATURE_SECURE_PROCESSING'.
                at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:990)
                at com.aspp.dms.ruleengine.transformation.TemplatesCache.retrieveUncached(TemplatesCache.java:44)
                at com.aspp.dms.ruleengine.transformation.TemplatesCache.retrieveUncached(TemplatesCache.java:21)
                at com.gratex.java.util.SoftValueCache.get(SoftValueCache.java:41)
                at com.aspp.dms.ruleengine.transformation.XSLTTransformator.transform(XSLTTransformator.java:73)

你能帮我找到正确的java参数来解决我的问题吗?比如-DxpathOperatorsLimit=150
谢谢

cetgtptt

cetgtptt1#

这种行为似乎来自新的FEATURE_SECURE_PROCESSING,Oracle在最近的Java“更新”中引入了该功能。https://www.oracle.com/java/technologies/javase/11-0-15-relnotes.html
他们引入了3个参数:

  1. jdk.xml. xpathExprGrp限制说明:限制XPath表达式可以包含的组数。默认值为10。
  2. jdk.xml.xpathExprOpLimit说明:限制XPath表达式可以包含的运算符数。默认值为100。
  3. jdk.xml.xpathTotalOpLimit说明:限制XSL样式表中XPath运算符的总数。默认值为10000。
    您的问题出现在#2(JAXP 0801002,默认值100)上。我们在#3(JAXP 0801003,默认值10.000)上遇到了一个非常类似的问题,包含以下消息(引用,以便Google可以找到它):
ERROR:  'JAXP0801003: the compiler encountered XPath expressions with an accumulated '10.002' operators that exceeds the '10.000' limit set by 'FEATURE_SECURE_PROCESSING'.'
FATAL ERROR:  'JAXP0801003: the compiler encountered XPath expressions with an accumulated '10.002' operators that exceeds the '10.000' limit set by 'FEATURE_SECURE_PROCESSING'.'

我们浪费了两天时间才摆脱了那件事。
我们在java调用中添加了一些参数:

java -Djdk.xml.xpathExprGrpLimit=0 -Djdk.xml.xpathExprOpLimit=0 -Djdk.xml.xpathTotalOpLimit=0 -Xmx2g -Xms512m -XX:-UseGCOverheadLimit ....

参数1、2、3用于解决问题。值“0”将限制设置为“off”。由于XPath现在可以变得很大,因此设置堆和堆栈大小并更改垃圾收集的行为(参数4-6)可能是明智的。
希望对你也有帮助,玩得开心!

f0brbegy

f0brbegy2#

如果你在MacBook M1或更新版本上遇到这个问题。请尝试亚马逊Corretto或Zulu的兼容JDK版本。我不得不尝试多个版本才能正常工作,但具体来说是8. 275. https://www.azul.com/downloads/?version=java-8-lts&os=macos&architecture=arm-64-bit&package=jdk&show-old-builds=true
希望这有帮助!

7uhlpewt

7uhlpewt3#

拉胡尔·米纳-Djdk.xml.xpathExprGrpLimit=0 -Djdk.xml.xpathExprOpLimit=0 -Djdk.xml.xpathTotalOpLimit=0
在你的重启文件里放3个步骤。

h5qlskok

h5qlskok4#

我在使用Oracle OpenJDK17的M1 mbp中遇到了这个错误。在基于OpenJDK17和Centos的产品环境中运行时也会出现这个错误。
这个answer确实对我有帮助,但是我不能修改我们产品集群中的所有JVM配置。
我用Java代码设置了这三个参数:

System.setProperty("jdk.xml.xpathExprGrpLimit", "0");
System.setProperty("jdk.xml.xpathExprOpLimit", "0");
System.setProperty("jdk.xml.xpathTotalOpLimit", "0");

注意:请在初始化TransformerFactory之前设置这些参数。

相关问题