【问题标题】:ColdFusion 2018 Bean-DAO-Manager OOP Logic ErrorsColdFusion 2018 Bean-DAO-Manager OOP 逻辑错误
【发布时间】:2020-03-27 17:46:40
【问题描述】:

我正在尝试通过重新创建经过验证的 Bean-DAO-Manager 设置来了解 ColdFusion 中的 OOP。在示例中,我仅使用 Create,但读取、更新和删除也存在问题。 我认为我在传递论点时犯了一些错误。 在 index.cfc 中,我从包含 API 的 testBeanDaoManager.cfc 创建一个对象。在这里,创建了应该保存属性的 bean。从那里调用管理器,该管理器调用文件 testDAO.cfc 中的 db-query。

错误表明找不到 bean 的方法 getName()(更多详细信息在帖子末尾)。

非常感谢任何帮助。

数据库和表: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>

【问题讨论】:

  • 您忘记解释您遇到的问题。如果您遇到错误,请edit 包含错误消息的问题。
  • 我的盲目猜测:var bean = gettestBean(arguments.ID); 不会返回 testBean 的实例。您的帖子中没有包含上述功能。
  • testBean.cfc 包含在代码中,请重新检查
  • Alex,是的,你是对的,在 testManager.cfc 和 testBeanDaoManger.cfc 中有对 testBean.cfc 的引用,我没有发布。我添加了它们。

标签: oop coldfusion javabeans dao


【解决方案1】:

(评论太长)

你在打电话

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 功能。即使它有一个,您也必须返回一个实例(bean),这对于称为 getName 的方法有点误导。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2012-08-26
    相关资源
    最近更新 更多