ColdFusion 2016跨文件夹调用CFC组件失败问题求助
这个问题我之前帮不少开发者排查过,核心原因是ColdFusion解析CFC的点语法路径时,默认是相对于当前执行CFM文件的所在目录,而不是应用根目录。
问题根源拆解
你在根目录的Application.cfc里设置application.cfclogin = "comp.login",根目录的CFM文件和comp文件夹同级,所以ColdFusion能正确找到/comp/login.cfc;但子文件夹里的Layout.cfm,它的相对基准路径是/subfolder/,ColdFusion会尝试去/subfolder/comp/login.cfc找文件,自然找不到就抛出错误。你试过加应用名称无效,大概率是没配置正确的应用映射或组件搜索路径。
具体解决方案(CF2016版本完全适用)
方案1:配置应用根目录映射(推荐)
在Application.cfc的onApplicationStart()方法里添加根目录映射,让所有路径解析都基于应用根:
function onApplicationStart() { // 获取应用根目录的绝对路径 var appRootPath = getDirectoryFromPath(getCurrentTemplatePath()); // 添加映射,别名可以自定义,比如/appRoot this.mappings["/appRoot"] = appRootPath; // 用映射后的绝对路径设置CFC引用 application.cfclogin = "appRoot.comp.login"; }
之后不管是根目录还是子文件夹的CFM,调用<cfinvoke component="#application.cfclogin#" method="sgice_redirect" />都能准确定位到根目录的CFC。
方案2:设置全局组件搜索路径
直接让ColdFusion把应用根目录纳入组件搜索范围,这样所有点语法路径都会优先在根目录查找:
可以在CF管理员的「Server Settings > Settings」里,把你的应用根目录F:/WebSitesTij/CFSites/sit_tij/添加到「Component Search Paths」列表;或者在Application.cfc里动态设置:
function onApplicationStart() { var appRootPath = getDirectoryFromPath(getCurrentTemplatePath()); // 将根目录追加到组件搜索路径 this.componentPaths = listAppend(this.componentPaths, appRootPath); // 保持原来的设置即可 application.cfclogin = "comp.login"; }
这样修改后,子文件夹的CFM调用时,ColdFusion会自动去应用根目录找comp/login.cfc,无需修改调用代码。
方案3:临时应急方案(不推荐长期用)
如果不想修改Application.cfc,也可以在子文件夹的CFM里直接用绝对路径创建CFC:
<cfinvoke component="#createObject('component', 'comp.login')#" method="sgice_redirect" />
不过这种方法会分散路径配置,不如全局统一管理方便。
为什么其他站点正常?
同一服务器的其他站点肯定已经配置了上述的映射或组件搜索路径,所以点语法的CFC路径能被全局解析。你这个站点只是缺了这个关键配置而已。
内容的提问来源于stack exchange,提问作者AlanVelasco

