无法使用ColdFusion 10.0正确初始化xml-security库

时间:2015-04-06 22:33:41

标签: java xml coldfusion

我在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();”在使用该库中的任何功能之前执行此操作。

谢谢。

1 个答案:

答案 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; - )