Cha*_*son 3 coldfusion coldfusion-11 lucee
当我使用以下代码时:
<cftry>
<cfif CompareNoCase(request.engine,"Railo") EQ 0>
<cfset RestInitApplication(request.filepath & "\com\api",local.serviceMapping,false,request.webAdminPassword) />
<cfelse>
<cfset RestInitApplication(request.filepath & "\com\api",local.serviceMapping) />
</cfif>
<cfcatch>
</cfcatch>
</cftry>
Run Code Online (Sandbox Code Playgroud)
Adobe Coldfusion引发以下编译错误:
Parameter validation error for the RESTINITAPPLICATION function.
The function accepts 1 to 3 parameters.
Run Code Online (Sandbox Code Playgroud)
谁能建议我可以阻止Coldfusion抛出错误的方法?
如果我尝试执行以下操作:
<cfif CompareNoCase(request.engine,"Railo") EQ 0>
<cfset RestInitApplication(dirPath=request.filepath & "\com\api",serviceMapping=local.serviceMapping,password=request.webAdminPassword) />
<cfelse>
<cfset RestInitApplication( dirPath=request.filepath & "\com\api", serviceMapping=local.serviceMapping) />
</cfif>
Run Code Online (Sandbox Code Playgroud)
ACF引发另一种编译错误:
Parameter validation error for the RESTINITAPPLICATION function.
A built-in ColdFusion function cannot accept an assignment statement as a parameter, although it can accept expressions. For example, RESTINITAPPLICATION(d=a*b) is not acceptable.
Run Code Online (Sandbox Code Playgroud)
如果我尝试:
<cfif CompareNoCase(request.engine,"Railo") EQ 0>
<cfset this.webAdminPassword = request.webAdminPassword />
<cfset RestInitApplication(request.filepath & "\com\api",local.serviceMapping) />
<cfelse>
<cfset RestInitApplication(request.filepath & "\com\api",local.serviceMapping) />
</cfif>
Run Code Online (Sandbox Code Playgroud)
Lucee引发错误,告诉我密码未定义。
环境:
Windows 10上的ACF11
Windows 2008R2服务器上的Lucee 4.5
好。我找到了官方支持的解决方案。如果您查看Adobe Coldfusion官方文档,页面底部的标题为“站点级REST应用程序支持”的段落:
它指出您可以使用:
this.restsettings
Run Code Online (Sandbox Code Playgroud)
对于几乎所有:
RestInitApplication()
Run Code Online (Sandbox Code Playgroud)
参数。
我尝试了未提及的内容,例如:
dirPath
password
Run Code Online (Sandbox Code Playgroud)
而且有效。
所以这是解决方案:
<cfif CompareNoCase(request.engine,"Railo") EQ 0>
<cfset this.restsettings.dirPath = request.filepath & "\com\api" />
<cfset this.restsettings.serviceMapping = local.serviceMapping />
<cfset this.restsettings.password = request.webAdminPassword />
<cfelse>
<cfset this.restsettings.dirPath = request.filepath & "\com\api" />
<cfset this.restsettings.serviceMapping = local.serviceMapping />
</cfif>
Run Code Online (Sandbox Code Playgroud)
更新1
我诚挚地发现,当对REST API CFC进行更改时,需要刷新其余的应用程序。
目的是:
RestInitApplication()
Run Code Online (Sandbox Code Playgroud)
因此,我设计了一种解决此问题的解决方案,实际上简化了例程。似乎RestInitApplication()所需的唯一参数是:
dirPath
Run Code Online (Sandbox Code Playgroud)
根据这些新信息,以下是我的原始答案:
<cftry>
<cfif CompareNoCase(request.engine,"Railo") EQ 0>
<cfset this.restsettings.password = request.webAdminPassword />
</cfif>
<cfset restInitApplication(local.dirPath,local.serviceMapping)>
<cfcatch>
</cfcatch>
</cftry>
Run Code Online (Sandbox Code Playgroud)
您实际上可以删除第二个参数,并将其替换为:
<cfset this.restsettings.serviceMapping = local.serviceMapping />
Run Code Online (Sandbox Code Playgroud)
但是,我将把这个决定留给您!
更新2:
与肖恩·科菲尔德(Sean Corfield)交谈后,他还建议了另一种方法,这确实很聪明。
使用方法:
<cfinclude>
Run Code Online (Sandbox Code Playgroud)
作为restInitApplication()的每个版本的容器
即使参数计数冲突仍然存在,代码也不会在编译时抛出错误。当放在条件子句中时,cfinclude充当缓冲区。
因此,这是第二种解决方案,我认为这是最干净的解决方案,因为它初始化了REST API的实现方式:
<cfif CompareNoCase(request.engine,"Railo") EQ 0>
<cfset restinitdirpath = local.dirPath>
<cfset restinitservicemapping = local.serviceMapping>
<cfset restinitdefault = false>
<cfset restinitpassword = request.webAdminPassword>
<cfinclude template="includes/structures/rest/railo-rest-init-structure.cfm">
<cfelse>
<cfset restinitdirpath = local.dirPath>
<cfset restinitservicemapping = local.serviceMapping>
<cfinclude template="includes/structures/rest/coldfusion-rest-init-structure.cfm">
</cfif>
Run Code Online (Sandbox Code Playgroud)
railo-rest-init-structure.cfm
<cfoutput>
<cfparam name="restinitdirpath" default="">
<cfparam name="restinitservicemapping" default="">
<cfparam name="restinitdefault" default="false">
<cfparam name="restinitpassword" default="">
<cfset restInitApplication(restinitdirpath,restinitservicemapping,restinitdefault,restinitpassword)>
</cfoutput>
Run Code Online (Sandbox Code Playgroud)
coldfusion-rest-init-structure.cfm
<cfoutput>
<cfparam name="restinitdirpath" default="">
<cfparam name="restinitservicemapping" default="">
<cfset restInitApplication(restinitdirpath,restinitservicemapping)>
</cfoutput>
Run Code Online (Sandbox Code Playgroud)
现在,我已经对此进行了测试,并且可以正常工作,并且每次单击restInitApplication()时,都会检测到对REST API CFC所做的任何更改。