未找到方法,Coldfusion 11,CreateObject

Method was not found, Coldfusion 11, CreateObject

我有一个包含以下代码的 .cfm 文件:

<cfset myObj=CreateObject( "java", "Test" )/>
<cfset a = myObj.init() >
<cfoutput>
    #a.hello()#
</cfoutput>
<cfset b = a.testJava() >

<cfoutput>
    #testJava()#
</cfoutput>

这引用了一个 Java class 文件:

public class Test
{
    private int x = 0;
    public Test(int x) {
            this.x = x;
    }
    public String testJava() {
            return "Hello Java!!";
    }
    public int hello() {
            return 5;
    }
}

我收到错误:

The hello method was not found.

Either there are no methods with the specified method name and argument types or the hello method is overloaded with argument types that ColdFusion cannot decipher reliably.
ColdFusion found 0 methods that match the provided arguments. If this is a Java object and you verified that the method exists, use the javacast function to reduce ambiguity.

我尝试了很多不同的方法,并且完全按照文档进行操作,here.class 文件 位于正确的位置,因为如果删除该文件会抛出 FNF 错误。

我也曾尝试以类似的方式使用 cfobject 标签,但没有成功。 None 个方法已找到。有什么想法吗?

Coldfusion 11,修补程序 7

我怀疑您 运行 陷入命名冲突。由于 java 源不包含 package 名称,因此 class 成为默认包 space 的一部分。如果已经加载了 different class(具有相同的名称),这可能会导致问题。 JVM 无法知道您想要哪个 "Test" class。

选择一个不同的(更独特的)class 名称应该可以解决问题。至少用于测试。但是,从长远来看,最好将 classes 分组到包中,以避免将来出现类似的命名冲突。

通常将自定义 class 捆绑到 .jar files for easier deployment. See Java: Export to a .jar file in Eclipse 中。要在 CF 中加载 jar 文件,您可以:

  • 通过新的 CF10+ 应用程序设置动态加载它们 this.javaSettings - 或 -
  • 将物理 .jar 文件放在 CF class 路径中的某个位置,例如 {cf_web_root}/WEB-INF/lib。然后重新启动 CF 服务器,以便检测到新的 jar。

Java

package com.mycompany.widgets;
public class MyTestClass
{
    private int x;
    public MyTestClass(int x) {
            this.x = x;
    }
    public String testJava() {
            return "Hello Java!!";
    }
    public int hello() {
            return 5;
    }
}

冷聚变:

 <cfset myObj = CreateObject( "java", "com.mycompany.widgets.MyTestClass" ).init( 5 ) />
 <cfdump var="#myObj#">

 <cfset resourcePath = "/"& replace(myObj.getClass().getName(), "." , "/")& ".class">
 <cfset resourceURL = getClass().getClassLoader().getResource( resourcePath )>

<cfoutput>
    <br>Resource path:  #resourcePath#
    <br>Resource URL <cfif !isNull(resourceURL)>#resourceURL.toString()#</cfif>
    <br>myObj.hello() = #myObj.hello()#
    <br>myObj.testJava() = #myObj.testJava()#
</cfoutput>

注意: 虽然不是标准,但从技术上讲,您可以使用包含单个 class 文件的包。但是,您必须将整个包结构复制到 WEB-INF\classes 文件夹中。比如使用上面的class,编译后的class文件应该复制到:

 c:/{cfWebRoot}/web-inf/classes/com/mycompany/widgets/MyTestClass.class