Coldfusion:cross ACF11/Lucee 4.5 RestInitApplication()解决方案
当我使用以下代码时:Coldfusion:cross ACF11/Lucee 4.5 RestInitApplication()解决方案,coldfusion,coldfusion-11,lucee,Coldfusion,Coldfusion 11,Lucee,当我使用以下代码时: <cftry> <cfif CompareNoCase(request.engine,"Railo") EQ 0> <cfset RestInitApplication(request.filepath & "\com\api",local.serviceMapping,false,request.webAdminPassword) /> <cfelse> <cfs
<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>
谁能建议一种方法,我可以阻止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>
如果我尝试:
<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>
Lucee抛出一个错误,告诉我密码没有定义
环境:
Windows 10上的ACF11
Windows 2008R2服务器上的Lucee 4.5正常。我找到了一个官方支持的解决方案。如果您查看Adobe Coldfusion官方文档中标题为“站点级REST应用程序支持”的段落,请参阅页面底部: 它说明您可以使用:
this.restsettings
对于几乎所有的:
RestInitApplication()
参数
我试过那些没有提到的,比如:
dirPath
password
它是有效的
因此,解决方案如下:
<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>
因此,我设计了一个解决方案来解决这个问题,实际上简化了日常工作。RestInitApplication()似乎需要的唯一参数是:
dirPath
根据这些新信息,以下是对我最初答案的补充:
<cftry>
<cfif CompareNoCase(request.engine,"Railo") EQ 0>
<cfset this.restsettings.password = request.webAdminPassword />
</cfif>
<cfset restInitApplication(local.dirPath,local.serviceMapping)>
<cfcatch>
</cfcatch>
</cftry>
实际上,您可以删除第二个参数,并将其替换为:
<cfset this.restsettings.serviceMapping = local.serviceMapping />
但是,我会把这个决定留给你
更新2:
在与肖恩·科菲尔德(Sean Corfield)交谈之后,他还提出了另一种方法,这种方法非常聪明
使用:
<cfinclude>
作为每个版本的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>
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>
<cfoutput>
<cfparam name="restinitdirpath" default="">
<cfparam name="restinitservicemapping" default="">
<cfset restInitApplication(restinitdirpath,restinitservicemapping)>
</cfoutput>
coldfusion 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>
<cfoutput>
<cfparam name="restinitdirpath" default="">
<cfparam name="restinitservicemapping" default="">
<cfset restInitApplication(restinitdirpath,restinitservicemapping)>
</cfoutput>
现在,我已经对此进行了测试,它可以正常工作,并且每次点击restInitApplication()时,都会检测到对REST API CFC所做的任何更改。如果指定参数名称,是否有任何更改?ie
restInitApplication(dirPath=request.filepath&“\com\api”),serviceMapping=local.serviceMapping)
这是一个好主意,但ACF会抛出另一种编译错误。RESTINITAPPLICATION函数的参数验证错误。内置ColdFusion函数不能接受赋值语句作为参数,尽管它可以接受表达式。例如,RESTINITAPPLICATION(d=a*b)是不可接受的。该函数是混乱的,因为您尝试的应该工作,因为最后2个参数是可选的。无论如何,提供“可选”的第三个参数(结构)似乎可以使其工作:
3个参数可以,但在ACF中4个参数不行。我需要给Lucee提供4个密码,因为密码是第4个,不幸的是…是的,这很烦人。。。在某些情况下,我能理解他们为什么想要偏离,但这次不行。虽然Adobe肯定也把实现搞砸了,只是用了另一种方式:-/Good find。谢谢你把它写下来:)。。为了安全起见,也要更改它;-)<代码>@Ageax是。肖恩,这颗宝石真让我吃惊!嗯,也许你说的更新1是对的,更好。它当然更短!您还可以使用this.webAdminPassword='123456',而不是this.restsettings.password='123456'。所以,有很多不同的方法可以使用……这是因为他是一个巫师;-)
<cfoutput>
<cfparam name="restinitdirpath" default="">
<cfparam name="restinitservicemapping" default="">
<cfset restInitApplication(restinitdirpath,restinitservicemapping)>
</cfoutput>