我使用以下内容在 CF 10 中进行初始化,并将 xmlsec-1.5.8.jar 文件放置在 Coldfusion10/cfusion/lib 下
<cfset Init = CreateObject("Java", "org.apache.xml.security.Init.Init()")>
我还尝试将上述代码放入 cfscript 中
Init = CreateObject("Java", "org.apache.xml.security.Init.Init()");
我收到以下错误。
在使用 xml-security 库之前,您必须正确初始化它。调用静态方法“org.apache.xml.security.Init.init();”在使用该库中的任何功能之前执行此操作。
谢谢。
最佳答案
除了语法错误之外,还有一个问题。错误消息表明您必须首先调用该类的静态方法。字面意思是 init()
。问题是 init()
在 CF 中有特殊含义。 CF 不允许对 java 对象使用 new
关键字。相反,它使用名称 init()
作为伪构造函数,它允许您创建类的新实例。所以当你这样做时:
obj = createObject("java", "org.apache.xml.security.Init").init();
CF 将创建该类的一个新实例,而不是调用名为 init()
的方法。 AFAIK,唯一的解决方法是使用 reflection 。大致如下:
// get a reference to the class
ref = createObject("java", "org.apache.xml.security.Init");
// initialize if needed
if (!ref.isInitialized()) {
// find static method named "init" with no parameters
method = ref.getClass().getDeclaredMethod("init", []);
// invoke it via reflection
method.invoke(ref, javacast("null", ""));
}
placed the xmlsec-1.5.8.jar file under Coldfusion10/cfusion/lib
虽然这样做没有什么问题,但从 CF10 开始,您还可以通过应用程序设置动态加载 jar,即 this.javaSettings 。如果这个功能看起来很熟悉,那么它基本上就是 Mark Mandel's 的一个片段。 awesome JavaLoader.cfc ,仅烘焙到 CF 中;-)
关于java - 无法使用 ColdFusion 10.0 正确初始化 xml 安全库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29480784/