【问题标题】:Xpages runtime interpreting java package name as String objectXpages 运行时将 java 包名解释为 String 对象
【发布时间】:2016-06-10 08:58:03
【问题描述】:

从我们当前 Xpages 项目中的所有奇怪之处来看,这个项目目前已经达到了天花板:

我们在当前项目中创建了一些 java bean。在 Domino Designer 中,它们都存储在 Code >> Java 下,因此很明显它们自动成为项目类路径的一部分。我们所有的 bean 都属于一个包结构de.edcom.*(这是我们一直使用的,没有任何问题)。这些对象大多使用完整的包名从 SSJS 调用(由于各种原因未注册为托管 bean),如

var o = de.edcom.myObject.someMethod();

在我以前的任何 Xpages 项目中,这都没有引起任何问题,它只是起作用了。然而,在当前项目中,XSP 运行时突然开始将包名解释为 String 对象,给我们这个运行时错误:

Unknown member 'edcom' in Java class 'java.lang.String'

有问题的 ssjs 代码行如下所示:

return de.edcom.TOC.buildTOC();

我们绝对不知道是什么原因造成的,为什么只在这个项目中,以及为什么它有时可以工作,但大多数情况下没有。

这个项目和之前的其他项目有一个不同之处,那就是本地化:用户可以在“英语”和“德语”语言环境之间切换,当然我们使用的是类似的代码

context.setLocaleString("de")

当然,我们有几个 javascript 代码片段在寻找本地设置,如

if(context.getLocalString()==="de"){...

事实上,今天早上我们已经将所有 java bean 重命名/重构为不同的包名 (com.edcom.*),从那时起错误就没有出现过(手指交叉!)。

但话说回来,我觉得这太愚蠢了,不可能真的有联系,或者可以吗?

编辑:

我尝试将importPackage()xe:objectData 数据源结合使用(正如Adrian 和Paul 在他们的回答中所建议的那样),但我仍然收到“unknown member 'edcom' in Java class 'java.lang,String'”消息,现在只是在不同的位置在我的代码中写着importPackage(de.edcom)

我将切换回“com.edcom”包并继续寻找更好的解决方案;不幸的是,在整个代码中搜索字符串“de”会产生接近 12.000 个匹配项;现在可以在大海捞针中找到真正的原因

编辑 #2:

看起来我们终于找到了可怕的“de”变量:它很好地隐藏在计算出的 customControl 属性中;我不知道为什么我在过去几天执行的所有文件搜索都找不到这个。

无论如何,很高兴知道我们在命名 ssjs 变量时必须更加小心;我从没想过 ssjs 变量名会干扰 Java 包中的 TLD 部分;我们可能会制定内部政策,我们的变量必须命名为“vDe”、“vCom”、“vIt”等,而不仅仅是短小写字母……

【问题讨论】:

  • 不要忘记解释这种内部政策的含义。否则,您可能会遇到来自梵蒂冈的变量“vA”和软件包的麻烦:-)

标签: xpages javabeans xpages-ssjs


【解决方案1】:

您可能在另一个 SSJS 脚本中使用了变量 de(它是一个字符串),该脚本在遇到问题之前运行。

我见过类似的问题,即未在脚本块中显式声明的变量可以从另一个脚本块继承值。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.beforeRenderResponse><![CDATA[#{javascript:
        var ex1 = "Hello World";
        var ex2 = "Bye bye"}]]>
    </xp:this.beforeRenderResponse>
    <xp:this.afterRenderResponse><![CDATA[#{javascript:
        print("value ex1: " + ex1);
        print("value ex2: " + ex2);}]]>
    </xp:this.afterRenderResponse>
</xp:view>

结果:

[1CA8:000C-4354] 10.06.2016 14:33:01   HTTP JVM: value ex1: Hello World
[1CA8:000C-4354] 10.06.2016 14:33:01   HTTP JVM: value ex2: Bye bye

因此您应该使用importPackage() 函数来导入对您的Java 类的引用,或者更好,使用托管bean 或dataContexts

【讨论】:

  • 对不起,我不得不撤回我对您的回答的早期接受;即使使用 importPackage() 并结合 Paul 关于 xe.objectData 的提示,我仍然收到相同的错误;看我上面的版本
  • 您是否搜索过任何名为“de”的变量?
  • 是的,我找到了,最后也找到了一个(参见我的第二次编辑)
  • 我很想知道重用变量的示例是否适用于 pageLoad 和 renderResponse 方法。我怀疑不是。我怀疑该变量是在 beforeRenderResponse 触发时声明的,并且由于它处于页面级别,因此直到 Render Response 阶段结束时才将其删除。我怀疑如果在 beforePageLoad 中声明它会在页面加载结束时被删除,但我可能错了。
  • 不幸的是,该变量并未在任何地方删除。看看我制作的版画。在每个脚本块中,我都将 var 设置为它自己的名称。 event afterRestoreView undefinedrendered property of a panel: afterRestoreViewrendered property of a panel: rendered property of a panelrendered property of a panel: rendered property of a panelevent handler onclick button1: rendered property of a panelevent beforeRenderResponse: event handler onclick button1rendered property of a panel: beforeRenderResponseevent afterRenderResponse: rendered property of a panel
【解决方案2】:

SSJS 需要将变量放入作用域中。任何带有点的东西都会首先进入这些变量。听起来本地化将翻译存储在名为“de”的变量中,这可以解释您的问题。

也许importPackage(de.edcom) 然后使用return TOC.buildTOC(); 可以解决问题。我会考虑这种更好的做法,但在 SSJS 中,无论哪种方式,您都存在变量名冲突的风险。

就个人而言,我更喜欢使用控制器 Java 类来支持每个 XPage(我使用 Jesse Gallagher 的霜冻框架,因此它始终可以通过变量 pageController 访问),所以我的 SSJS 只调用 pageController.myMethod(),这样就避免了所有名称冲突并允许 Java 导入以确保我映射到正确的 Java 类。还有更基本的方法,例如每个 XPage 的顶部都有一个 xe:dataObject。

【讨论】:

  • 一如既往的完美帮助,同样适用于@Adrian的其他答案;因为我只能接受一个答案,所以我决定向 Adrian 提出一些观点;希望你不介意;) - 顺便说一句,你的答案中有一个错字:它应该是'xe:dataObject'。但我还是找到了它(通过你的一篇博客文章的帮助)
  • 嗯 - 接受答案有点早 - 仍然无法正常工作,请参阅上面的版本
  • 关键是要找出de对象是什么。由于它在您的代码运行时就存在,您是否尝试过print(de)(或其他一些日志记录语法)来找出它是什么?
  • 这或多或少是我今天早上所做的,实际上我添加了一个computedField;就在一个小时前,我能够将它固定到一个(隐藏得很好)计算的 customControl 属性。底线是我们永远不能使用可能会干扰 TLD 名称的 ssjs 变量 namesw,例如“var com='Company'”、“var it='information technology'”(如果您是意大利开发人员,那就是)等等 ;) - 奇怪的东西......
  • 很高兴你最终找到了它。听起来这是一次有用的学习经历,虽然当时很痛苦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多