【发布时间】: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.invoke或variables.invoke可能会修复它。 -
@PeterBoughton,谢谢。我对调用的任何尝试都没有奏效。最后,旧版本的 Railo 解决了这个问题。
标签: apache tomcat coldfusion railo cfml