背景
我正在尝试创建一个函数componentFromJson,它可以从JSON中重建一个组件图。我采用了一种简单的方法,使用getMetaData来查找组件属性来实例化正确的类型。
这个函数的用法如下:comp = componentFromJson(json, 'RootComponentType')
问题
问题是,属性的类型不一定完全限定,因为名称空间可能已经导入,如下所示。
<cfimport path="some.namespace.Test">
<cfcomponent>
<cfproperty name="test" type="Test">
</cfcomponent>当我试图从createObject('Test')函数上下文执行componentFromJson时,它显然失败了,因为调用上下文没有导入。
我尝试过许多不同的方法来解决这个问题,包括动态地在父组件上定义组件工厂函数,以及使用invoke在父CFC上下文中调用工厂函数,但是它不起作用。
例如。
<cfscript>
parentCmp = createObject('SomeCmp');
parentCmp.createComponent = function (type) {
return createObject(type);
};
childCmp = invoke(parentCmp, 'createComponent', { type = 'Test' });
</cfscript>可怕的解决方案
我现在能想到的解决这个问题的唯一方法是解析CFC的ColdFusion代码并提取导入语句,但我认为这样做太慢了。不仅如此,这并不能涵盖所有边缘案件。
想法?
我想知道是否有人有更好的主意来解决这个问题?我能采取完全不同的方法吗?可能有一种方法可以使用ColdFusion运行时类来实现这一点,但我还没有弄清楚。
发布于 2016-08-24 22:28:56
实际上,当您了解ColdFusion运行时的基本机制(我很难找到它)时,这并不难。
最后,我发现一个ColdFusion组件(它被表示为一个coldfusion.runtime.TemplateProxy )封装了一个coldfusion.runtime.CFPage实例,而这个实例又有一个createObject方法。
因此,下面是我提出的使用Java反射的解决方案:
<cfset host = new SomeComponent()>
<cfset pageField = createObject('java', 'coldfusion.runtime.TemplateProxy').getClass().getDeclaredField('page')>
<cfset pageField.setAccessible(true)>
<cfset page = pageField.get(host)>
<cfset test = page.createObject('Test')>https://stackoverflow.com/questions/39130369
复制相似问题