我一直在研究这个,似乎无法找到任何关于它的东西。
我们致力于CF8。当我的同事尝试安装我的最新代码更新时,他开始看到提供给函数的参数不是指定接口类型的错误。为我工作得很好。相同的设置。有时它对他有用。在我们的开发服务器上也有问题。
此后我能够在本地隔离并重现问题。
这是设置。
我在服务器上有2个映射:
然后我创建了一个接口,称之为ISubject和一个实现它的组件,名为Person,并在包下保存。这是Person的声明:
cfcomponent implements="packages.ISubject"
最后,有一个名为SubjectMediator的组件,它带有一个名为setSubject的函数,它需要一个ISubject接口类型的对象。这是setSubject的参数声明:
cfargument name="subject_object" type="packages.ISubject"
实施:
variables.person = createObject("component", "packages.Person").Init();
variables.subjectMediator = createObject("component", "packages.SubjectMediator ").Init();
variables.subjectMediator.setSubject(variables.person);
最后一行抛出Person不是ISubject类型的错误。如果我针对ISubject对Person执行isInstanceOf(),则验证正常。
所以这是发生的原因?转储getMetaData(variables.person)向我显示接口路径是webapp。[domain] .ISubject。事实上,如果我改变参数的type属性来使用这个路径而不是packages.ISubject,那么一切都很好。
Coldfusion似乎是随意选择解析接口的映射,然后简单地进行字符串比较以检查类型参数?
任何人都不得不与此抗衡?我需要webapp映射,并且我无法将对“packages”的所有引用更改为“webapp。[domain]”。在这种情况下,我也无法使用特定于应用程序的webapp映射。虽然这3个选项中的任何一个都可以绕过这个问题,但我希望有人有一些见解......
我得到的最好的方法是将参数类型设置为“any”,然后在函数内部检查isInstanceOf()......看起来像是糟糕的形式。
谢谢,
仁
答案 0 :(得分:0)
您可以将包映射的内容移动到webroot之外吗?这似乎是解决问题的最简单方法。