2016-07-05 2 views
1

У меня есть .cfm файл со следующим кодом:метод не был найден, ColdFusion 11, CreateObject

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

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

Это ссылается Java файл класса: с

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 аналогичным образом без везения. Ни один из методов не найден. Есть идеи?

Coldfusion 11, исправлениях 7

+2

Это было долгое время, так как я сделал ColdFusion, но вам не нужно передать аргумент 'myObj.init() 'для удовлетворения параметра конструктора? –

+0

Да, я бы попробовал и без параметра, и не повезло. Это было главным образом для тестирования. – theblindprophet

ответ

1

Я подозреваю, что вы работаете в конфликт имен. Поскольку источник java не содержит имя package, класс становится частью пространства пакета по умолчанию. Это может вызвать проблемы, если уже был загружен класс (с таким же именем). JVM не имеет никакого способа узнать, какой класс «Тест» вам нужен.

Выбор другого (более уникального) имени класса должен решить проблему. По крайней мере, для тестирования. Однако в долгосрочной перспективе лучше группировать классы в пакеты, чтобы избежать подобных конфликтов имен в будущем.

Обычно пользовательские классы поставляются в .jar files для упрощения развертывания. См. Java: Export to a .jar file in Eclipse. Для загрузки файлов в банку CF вы можете:

  • Загрузите их динамически через новый CF10 + приложение настройки this.javaSettings -или-
  • Поместите физический файл .jar где-то в пути к классу CF, такие как {cf_web_root}/WEB-INF/lib. Затем перезапустите CF-сервер, чтобы была обнаружена новая банда.

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: Пока не норма, вы можете технически использовать пакеты с отдельными файлами классов. Однако вы должны скопировать всю структуру пакета в папку WEB-INF\classes. Например, используя выше класс, скомпилированный файл класса должен быть скопирован:

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