ХОРОШО. Я нашел решение, которое официально поддерживается. Если вы посмотрите официальную документацию Adobe Coldfusion, параграф, озаглавленный «Поддержка приложений REST на уровне сайта», в нижней части страницы:
https://helpx.adobe.com/coldfusion/developing-applications/changes-in-coldfusion/restful-web-services-in-coldfusion.html
В нем говорится, что вы можете использовать:
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>
ОБНОВЛЕНИЕ 1
С тех пор я обнаружил, что когда в REST API CFC вносятся изменения, остальное приложение необходимо обновлять.
Это цель:
RestInitApplication()
Итак, я разработал решение для решения этой проблемы, которое на самом деле упрощает рутину. Кажется, единственный параметр, который требуется 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:
Поговорив с Шоном Корфилдом, он также предложил другой подход, действительно умный.
С использованием:
<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>
coldfusion-rest-init-structure.cfm
<cfoutput>
<cfparam name="restinitdirpath" default="">
<cfparam name="restinitservicemapping" default="">
<cfset restInitApplication(restinitdirpath,restinitservicemapping)>
</cfoutput>
Теперь я протестировал это, и оно работает, и любые изменения, внесенные в ваши REST API CFC, впоследствии будут обнаруживаться каждый раз при нажатии restInitApplication().
person
Charles Robertson
schedule
08.08.2018
restInitApplication( dirPath=request.filepath & "\com\api"), serviceMapping=local.serviceMapping)
- person SOS   schedule 08.08.2018<cfset restInitApplication( request.filepath & "\com\api", local.serviceMapping, {})>
- person SOS   schedule 08.08.2018