Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coldfusion:cross ACF11/Lucee 4.5 RestInitApplication()解决方案_Coldfusion_Coldfusion 11_Lucee - Fatal编程技术网

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>