2016-07-05 20 views
1

Ich habe eine .cfm Datei mit dem folgenden Code:Methode nicht gefunden wurde, 11 ColdFusion-, Create

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

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

Dies verweist auf eine Java Klassendatei:

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; 
    } 
} 

ich den Fehler:

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. 

Ich habe viele verschiedene Möglichkeiten ausprobiert und bin der Dokumentation genau gefolgt, here. Die .class Datei ist an der richtigen Stelle, da ich FNF-Fehler ausgelöst wird, wenn die Datei entfernt wird.

Ich habe auch versucht, einen cfobject Tag in ähnlicher Weise ohne Glück zu verwenden. Keine der Methoden wird gefunden. Irgendwelche Ideen?

11 ColdFusion- Hotfix 7

+2

Es ist eine lange Zeit her, seit ich Coldfusion tat, aber nicht brauchen Sie ein Argument 'myObj.init() übergeben 'um den Konstruktorparameter zu erfüllen? –

+0

Ja du würdest es, ich habe es auch ohne Parameter versucht, und kein Glück. Das war hauptsächlich zum Testen. – theblindprophet

Antwort

1

Ich vermute, dass Sie in einen Namenskonflikt laufen. Da die Java-Quelle keinen package-Namen enthält, wird die Klasse Teil des Standard-Paketbereichs. Das kann Probleme verursachen, wenn eine andere Klasse (mit dem gleichen Namen) bereits geladen wurde. Die JVM hätte keine Möglichkeit zu wissen, welche "Test" -Klasse Sie haben wollten.

Wenn Sie einen anderen (eindeutigeren) Klassennamen auswählen, sollte das Problem behoben sein. Zumindest zum Testen. Auf lange Sicht ist es jedoch besser, Klassen in Pakete zu gruppieren, um ähnliche Namenskonflikte in Zukunft zu vermeiden.

In der Regel werden benutzerdefinierte Klassen zur einfacheren Bereitstellung in .jar files gebündelt. Siehe Java: Export to a .jar file in Eclipse. So laden Sie JAR-Dateien in CF haben folgende Möglichkeiten:

  • laden sie dynamisch über die neuen CF10 + -Anwendung Einstellung this.javaSettings -oder
  • Legen Sie die physische .jar-Datei irgendwo auf dem CF-Klassenpfad, wie {cf_web_root}/WEB-INF/lib. Starten Sie den CF-Server neu, damit das neue Jar erkannt wird.

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; 
    } 
} 

Coldfusion:

<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> 

NB: Während nicht die Norm, können Sie technisch Pakete mit einzelnen Klassendateien verwenden. Sie müssen jedoch die gesamte Paketstruktur in den Ordner WEB-INF\classes kopieren. Zum Beispiel mit der Klasse oben, sollte die kompilierten Klassendatei kopiert werden:

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