ColdFusion 2018 Bean-DAO-Manager OOP Logi c Ошибки - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь узнать о OOP в ColdFusion, воссоздав проверенную установку Bean-DAO-Manager. В примере я использую только Create, но проблема также существует для Read, Update и Delete. Я думаю, что я делаю некоторые ошибки при передаче аргументов. Из index.cf c я создаю объект из testBeanDaoManager.cf c, который содержит API. Здесь создается компонент, который должен содержать свойства. Оттуда вызывается менеджер, который вызывает db-запрос в файле testDAO.cf c.

В сообщении об ошибке указывается, что метод beName () компонента не найден (подробности см. В конце публикации).

Любая помощь с благодарностью.

База данных и таблица: testBeanDao.APP.TESTBEAN

Файлы: /index.cfm, /api/testBeanDaoManager.cfc, /logic/bean/testBean.cfc, /logic/dao/testDAO.cfc, /logic/manager/testManager.cfc

/index.cfm:
<cfscript>
    obj = createObject("component","api.testBeanDaoManager"); 
    add = invoke(obj,"addName", {ID=0, Name="Meo"}); 
</cfscript> 
/api/testBeanDaoManager.cfc
component rest=true restpath="names" {
    remote any function gettestBean(ID){ 
        var nameManager = createObject('component', 'logic.manager.testManager');
        var nameBean = nameManager.getName(arguments.ID);
        return nameBean;
    }

  remote any function addName(numeric ID, string Name, restArgSource="path", any Data = {})  httpmethod="post" restpath="add/{id}" {
    var bean = gettestBean(arguments.ID);
    var nameManager = createObject('component', 'logic.manager.testManager');
    bean.setName(arguments.Name); 
    bean = nameManager.addName(bean);
    return bean;
  }
}
/logic/manager/testManager.cfc
<cfcomponent output="false" >

    <cffunction name="init" output="false" access="public" returntype="testManager">
        <cfset super.init(  gateway=createObject("component","logic.gateway.testGateway").init(),                                                   DAO=createObject("component","logic.dao.testDAO").init()) 
        />
        <cfreturn this />
    </cffunction>

    /**
     * Initializing Bean
     */
    <cffunction name="gettestBean" output="false" returntype="any">
        <cfset var bean = createObject("component","logic.bean.testBean") />
        <cfreturn bean />
    </cffunction>

<cffunction name="addName" output="false" returntype="any">
  <cfargument name="bean" required="true" />
  <cfset var dao = createObject("component","logic.dao.testDAO") />
  <cfset dao.insertName(bean) />

  <cfreturn bean />
</cffunction>
...
/logic/dao/testDAO.cfc
<cffunction name="insertName" returntype="any" output="false">
  <cfargument name="bean" type="any" required="true" />
  <cfquery name="local.result" datasource="testBeanDao" >
    INSERT INTO app.testBean (
        Name
    )
    VALUES (                     
        <cfqueryparam value="#arguments.bean.getName()#" cfsqltype="cf_sql_varchar">
        )
  </cfquery>
  <cfreturn local.result />
</cffunction>
/logic/bean/testBean.cfc
<cfcomponent displayname="testBean" output="false">

  <cffunction name="init" access="public" output="false" returntype="testBean">
      <cfset super.init() />
      <cfset variables.instance.ID = 0 />
      <cfset variables.instance.Name = arguments.Name />

      <cfreturn this />
  </cffunction>

  <cffunction name="load" access="public" returntype="any" output="false">
      <cfargument name="ID" type="numeric" required="true"/>
      <cfargument name="Name" type="string" required="true"/>

      <cfset setID(arguments.ID) />
      <cfset setName(arguments.Name) />

      <cfreturn this />
  </cffunction>

  <cffunction name="setName" returntype="void" access="public" output="false">
      <cfargument name="Name" type="string">
      <cfset variables.instance.Name = arguments.Name />
  </cffunction>

  <cffunction name="getName" returntype="string" access="public" output="true">
      <cfreturn variables.instance.Name />
  </cffunction>

  <cffunction name="setID" returntype="void" access="public" output="false">
      <cfargument name="ID" type="numeric" required="true" />
      <cfset variables.instance.ID = arguments.ID />
  </cffunction>

  <cffunction name="getID" returntype="numeric" access="public" output="true">
      <cfreturn variables.instance.ID />
  </cffunction>

</cfcomponent>

Сообщение об ошибке:

The web site you are accessing has experienced an unexpected error.
Please contact the website administrator.

The following information is meant for the website developer for debugging purposes.
Error Occurred While Processing Request
The getName method was not found.
Either there are no methods with the specified method name and argument types or the getName 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.

The error occurred in C:/programs/cfusion/wwwroot/cfproject/logic/dao/testDAO.cfc: line 35
Called from C:/programs/cfusion/wwwroot/cfproject/logic/manager/testManager.cfc: line 45
Called from C:/programs/cfusion/wwwroot/cfproject/api/testBeanDaoManager.cfc: line 53
Called from C:/programs/cfusion/wwwroot/cfproject/index.cfm: line 85
33 :            )
34 :            VALUES (                     
35 :                    <cfqueryparam value="#arguments.bean.getName()#" cfsqltype="cf_sql_varchar">
36 :                    )
37 :        </cfquery>

1 Ответ

0 голосов
/ 29 марта 2020

(слишком долго для комментария)

Вы звоните

var bean = gettestBean(arguments.ID);

, что указывает на gettestBean из /api/testBeanDaoManager.cfc. Этот

var nameManager = createObject('component', 'logic.manager.testManager');
var nameBean = nameManager.getName(arguments.ID);
return nameBean;

, но logic.manager.testManager не имеет никакой функции getName. Даже если бы он был, вы должны были бы возвратить экземпляр (бин), который вводит в заблуждение метод, называемый getName.

...