【发布时间】:2013-03-26 10:06:24
【问题描述】:
是否可以使用 JavaLoader 来获取由 CF 调用的 Web 服务返回的对象,并且 JavaLoader 加载的对象是相同的类路径上下文?我的意思是,没有很多困难?
// get a web service
ws = createObject("webservice", local.lms.wsurl);
// user created by coldfusion
user = ws.GenerateUserObject();
/* user status created by java loader.
** this api provider requires that you move the stubs
** (generated when hitting the wsdl from CF for the first time)
** to the classpath.
** this is one of the stubs/classes that gets called from that.
*/
UserStatus = javaLoader.create("com.geolearning.geonext.webservices.Status");
// set user status: classpath context clash
user.setStatus(UserStatus.Active);
错误:
- 详细信息:要么没有具有指定方法名称的方法,要么 参数类型或 setStatus 方法被参数重载 ColdFusion 无法可靠破译的类型。冷融合 找到 0 与提供的参数匹配的方法。如果这是一个 Java 对象 并且您验证了该方法存在,请使用 javacast 函数 减少歧义。
- 消息:未找到 setStatus 方法。
- 方法名设置状态
尽管表面上调用匹配用户上的方法签名--setStatus(com.geolearning.geonext.webservices.Status)--该类位于不同的类路径上下文中。这就是我收到上述错误的原因。
【问题讨论】:
-
(编辑)哎呀,我的意思是说你有没有尝试设置
parentClassLoader? -
那会是什么样子?对于这个 n00b,一些“仅供专家使用”的东西没有得到足够好的记录。
-
其实再看the API,最简单的方法就是设置
loadColdFusionClassPath=true。 注意 - 将loadColdFusionClassPath设置为“true”时,此值将被 ColdFusion 类加载器覆盖。这是一个快捷方式:javaLoader.init(loadPaths=arrayOfJars, parentClassLoader=getPageContext().getClass().getClassLoader()); -
这似乎没有帮助。我认为问题仍然存在:虽然 UserStatus 知道 CF 类路径(以及加载的类路径),但我认为没有任何方法可以让用户对象知道加载的类路径。所以我认为我们陷入了同样的困境。 (如果这听起来不对,请纠正我——我正在编造这些东西。)
-
嗯.. 听起来方法调用被拒绝了,因为
UserStatus是由不同的类加载器创建的。即类加载器是出了名的挑剔。它可以是正确的类,但如果它是由 不同的 类加载器创建的,它将无法被识别。如果这是问题所在,我认为共享父类加载器应该解决它。也就是说,你有什么理由不能只使用createObject来处理所有事情?此外,这是我们可以访问/测试的公共网络服务吗?
标签: web-services coldfusion classpath coldfusion-9 javaloader