【问题标题】:invoke command in application.cfc fails in railo 4.1 (error: missing required argument [object])application.cfc 中的调用命令在 railo 4.1 中失败(错误:缺少必需的参数 [object])
【发布时间】:2013-12-02 07:49:26
【问题描述】:

我正在从 Railo 3 升级到 4,并且遇到了旧的 Application.cfc 的问题。 Application.cfc 在 OnRequest 方法中的以下行失败:

content = invoke(controller = controllerPath, method = URL.action, arguments = {'data':FORM,'options':URL});

这是错误的部分内容:

Railo 4.1.1.009 错误(模板)

消息缺少函数 [invoke] 所需的参数 [object]

模式调用(object:any, name:string [, arguments:any]):object

文档调用给定对象的函数/操作,如果给定对象是字符串,Railo 会尝试作为组件加载。

必填:

  • object (any):包含函数的组件、结构或范围,也可以是组件的名称,在这种情况下,组件会被加载。
  • 名称(字符串):函数/操作的名称

可选:

  • arguments (any): 传递给函数/操作的参数

Stacktrace 发生的错误 /home/admin/quicktrackweb/src/web/cf3/Application.cfc:第 215 行

213: dynFunc = view[URL.action];

214:

215:内容 = 调用(控制器 = 控制器路径,方法 = URL.action,参数 = {'data':FORM,'options':URL});

216: //content = "test";

217: if (GetMetaData(dynFunc).access == 'remote') {

Java Stacktrace 缺少函数 [invoke] 所需的参数 [object] 在 railo.transformer.bytecode.expression.var.Variable.getMatchingValueAndType(Variable.java:700):700 在 railo.transformer.bytecode.expression.var.Variable._writeOutFirstBIF(Variable.java:458):458 在 railo.transformer.bytecode.expression.var.Variable._writeOutFirst(Variable.java:419):419 在 railo.transformer.bytecode.expression.var.Variable._writeOut(Variable.java:238):238 在 railo.transformer.bytecode.expression.var.Variable._writeOut(Variable.java:219):219 在 railo.transformer.bytecode.expression.ExpressionBase.writeOut(ExpressionBase.java:34):34 ...

这里是 OnRequest 方法:

    public void function OnRequest (required string TargetPage) {
            var content = '';
            var controllerPath = '';
            var dynFunc = '';
            var isDebug = false;
            var output = '';
            var response = '';
            var templatePath = 'views/login/login.cfm';
            var toolbar = CreateObject('component', 'controllers.toolbar');
            var view = '';
            import 'controllers.ajax';
                    //ssl implemtation
            if (!CGI.SERVER_PORT_SECURE) {
                    Location("http://#CGI.SERVER_NAME#/?#CGI.QUERY_STRING#", false);
            }


            param name='URL.view' type='string' default='home';
            param name='URL.action' type='string' default='';
            param name='URL.id' type='numeric' default=0;
            param name='URL.options' type='string' default='';

            URL.view = REReplace(URL.view, '\W', '', 'all');

            if (StructKeyExists(URL, 'faq')) {
                    templatePath = "views/home/faq.cfm";    
            } else if (SESSION.user.id || (URL.view == 'login' && URL.action == 'new')) {
                    if (StructKeyExists(GetHttpRequestData().headers, 'ajax')) {
                            var ajax = new ajax(request = GetHttpRequestData(), url = URL, form = FORM, cookie = COOKIE);

                            Header(name = 'Content-Type', value = 'application/json');
                            WriteOutput(ajax.getResponse());

                            return;
                    } else {
                            if (URL.action == '') {
                                    URL.action = ListGetAt(URL.view, ListLen(URL.view, '.'), '.');  
                            }

                            if (hasFunction('controllers.' & URL.view, URL.action) || hasFunction('controllers.#URL.view#.#URL.view#', URL.action)) {
                                    if (hasFunction('controllers.' & URL.view, URL.action)) {
                                            controllerPath = 'controllers.#URL.view#';
                                    } else {
                                            controllerPath = 'controllers.#URL.view#.#URL.view#';
                                    }

                                    view = CreateObject('component', controllerPath);
                                    dynFunc = view[URL.action];

========> Line where app fails:         content = invoke(controller = controllerPath, method = URL.action, arguments = {'data':FORM,'options':URL});

                                    if (GetMetaData(dynFunc).access == 'remote') {
                                            GetPageContext().getResponse().reset();
                                            Header(name = 'Content-Type', value = 'application/json');
                                            WriteOutput(content);
                                            return; 
                                    }

                                    templatePath = '';      
                            } else if (FileExists("views/#URL.view#/#URL.view#.cfm")){
                                    templatePath = "views/#URL.view#/#URL.view#.cfm";
                            } else{
                                    templatePath = "views/home/home.cfm";
                            }
                    }
            }

            if (content == '' && FileExists(templatePath)) {
                    savecontent variable = 'content' {include '#templatePath#';}    
            }

            if (CGI.SCRIPT_NAME == '/js/webapp.cfm') {
                    Header(name = 'Content-Type', value = 'application/javascript');
                    include '/js/webapp.cfm';
            } else if (CGI.SCRIPT_NAME == '/css/webapp.cfm') {
                    Header(name = 'Content-Type', value = 'text/css');
                    include '/css/webapp.cfm';
            } else {
                    include '/index.cfm';
            }

            //Return out.
            return;
    }

很抱歉爆破了所有这些代码,但由于我对 Railo/CF 还很陌生,我不知道从哪里开始。调用已被弃用,我应该用什么代替它?

似乎调用与以前的版本完全不同,因为它需要一个参数“对象”,但我有参数“控制器”、“方法”和“参数”

我的 Railo 版本是 4.1.1.009 我正在使用 Apache 2.2.22 和 Tomcat 7.0.20 的 Ubuntu 服务器上运行

【问题讨论】:

  • 除非需要兼容 CF10,否则不需要调用。执行content = view[url.action](data:form,options:url) 之类的操作 - 不确定这是否正是您所需要的(我不会为破译周围的代码而烦恼),但它会遵循这些原则。
  • 谢谢彼得。在代码的正上方有一行代码执行“view[URL.action]”。所以我仍然不清楚为什么代码调用调用(基于你的评论),或者我需要做什么才能让它工作。如果没有 OnRequest 方法覆盖,该站点将无法工作 - 我得到一个空白页面,并且一个简单的 cf 页面可以正常工作。你说的我尽力了。
  • 在 CF10 之前,没有 invoke 并且必须在 CF 中写入 x = view[URL.action]x(args),所以这可能是该行的来源。 (在 Railo 中,您总是可以一口气完成 view[URL.action](args)。)
  • 想一想,那里的参数名称实际上与the docs 中的名称不匹配(尤其是控制器),所以也许这不是打算使用新的调用 BIF,并且有一个名为调用的函数在代码中 - 如果是这样,将该行限定为 this.invokevariables.invoke 可能会修复它。
  • @PeterBoughton,谢谢。我对调用的任何尝试都没有奏效。最后,旧版本的 Railo 解决了这个问题。

标签: apache tomcat coldfusion railo cfml


【解决方案1】:

通过返回 Railo 3.3.4.003 final,匹配生产服务器,它可以工作。 3.3.4.003 确实与 9.0.0.1 具有 ColdFusion 兼容性。我认为这就是它现在可以工作的原因,我不必对 Application.cfc 中的代码进行任何更改,除了删除它检查 !CGI.SERVER_PORT_SECURE 的 http 重定向(导致重定向循环,我对此发表了评论)出)。

如果我的想法有误,请告诉我。

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 2022-01-01
    • 1970-01-01
    • 2015-11-02
    • 2017-12-09
    • 2021-05-09
    • 2016-03-10
    • 2019-05-09
    • 2013-05-08
    相关资源
    最近更新 更多