首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Coldfusion:交叉ACF11 11/Lucee4.5 RestInitApplication()解决方案

Coldfusion:交叉ACF11 11/Lucee4.5 RestInitApplication()解决方案
EN

Stack Overflow用户
提问于 2018-08-08 12:12:26
回答 1查看 288关注 0票数 3

当我使用以下代码时:

代码语言:javascript
运行
复制
<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>

Adobe引发以下编译错误:

代码语言:javascript
运行
复制
Parameter validation error for the RESTINITAPPLICATION function.
The function accepts 1 to 3 parameters. 

有人能提出建议吗,我可以阻止酷普尔抛出一个错误吗?

如果我试着做以下事情:

代码语言:javascript
运行
复制
<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>

ACF抛出一种不同类型的编译错误:

代码语言:javascript
运行
复制
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. 

如果我试着:

代码语言:javascript
运行
复制
<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

Windows2008R2服务器上的Lucee 4.5

EN

回答 1

Stack Overflow用户

发布于 2018-08-08 13:45:47

好的。我找到了一个得到官方支持的解决方案。如果您查看application官方文档,标题为“站点级REST应用程序支持”的段落,位于页面底部:

https://helpx.adobe.com/coldfusion/developing-applications/changes-in-coldfusion/restful-web-services-in-coldfusion.html

它声明您可以使用:

代码语言:javascript
运行
复制
this.restsettings

几乎所有的:

代码语言:javascript
运行
复制
RestInitApplication()

参数。

我试过没提到的那些,比如:

代码语言:javascript
运行
复制
dirPath
password

而且它是有效的。

因此,解决办法如下:

代码语言:javascript
运行
复制
<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>

更新1

后来我发现,当REST发生更改时,rest应用程序需要刷新。

这是为了:

代码语言:javascript
运行
复制
RestInitApplication()

因此,我设计了一个解决这个问题的解决方案,这实际上简化了例程。RestInitApplication()所需的唯一参数似乎是:

代码语言:javascript
运行
复制
dirPath

根据这一新信息,以下是对我最初答案的修正:

代码语言:javascript
运行
复制
<cftry>
  <cfif CompareNoCase(request.engine,"Railo") EQ 0>
    <cfset this.restsettings.password = request.webAdminPassword />
  </cfif>
  <cfset restInitApplication(local.dirPath,local.serviceMapping)>
  <cfcatch>
  </cfcatch>
</cftry>

您可以实际删除第二个参数,并将其替换为:

代码语言:javascript
运行
复制
<cfset this.restsettings.serviceMapping = local.serviceMapping />

但是,我会把这个决定留给你!

更新2:

在与肖恩·科菲尔德交谈后,他还提出了另一种方法,这是非常聪明的。

使用:

代码语言:javascript
运行
复制
<cfinclude>

作为每个版本的restInitApplication()的容器

即使参数计数冲突仍然存在,代码也不会在编译时抛出错误。当放置在条件子句中时,cfinclude充当缓冲区。

因此,这里有第二个解决方案,在我看来,也是最干净的解决方案,因为它集成了REST API,也就是它的实现方式:

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
<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>

coldfusion-rest-init-structure.cfm

代码语言:javascript
运行
复制
<cfoutput>

  <cfparam name="restinitdirpath" default="">
  <cfparam name="restinitservicemapping" default="">

  <cfset restInitApplication(restinitdirpath,restinitservicemapping)>

</cfoutput>

现在,我已经测试了这一点,它是有效的,对REST所做的任何更改,随后,将在每次restInitApplication()被击中时被检测到。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51746453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档