我在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();”在使用该库中的任何功能之前执行此操作。
谢谢。
答案 0 :(得分:2)
除语法错误外,还有另一个问题。错误消息表明您必须首先调用该类的静态方法。一个字面上命名为init()
的人。问题是init()
在CF中有特殊含义。 CF不允许将new
关键字与java对象一起使用。相反,它使用名称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", ""));
}
将xmlsec-1.5.8.jar文件放在Coldfusion10 / cfusion / lib
下
虽然这样做没有任何问题,但从CF10开始,您还可以通过应用程序设置动态加载jar,即this.javaSettings。如果该功能看起来很熟悉,那么它基本上只是Mark Mandel's awesome JavaLoader.cfc的一部分,只会被烧成CF; - )