从我们当前的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();
我们绝对不知道造成这种情况的原因,为什么只有在这个项目中,以及为什么它有时会起作用,但主要是不是。
此项目与其他项目之间存在一个区别,那就是本地化:用户可以在" english"之间切换。和"德国" locale,当然我们使用的代码如
context.setLocaleString("de")
当然我们有几个javascript代码片段正在寻找本地设置,如
if(context.getLocalString()==="de"){...
今天早上我们实际上已经将所有java bean重命名/重构为不同的包名(com.edcom。*),从那以后错误没有出现(手指交叉!)。
但是我再次认为这太愚蠢了,真的可以成为一种联系,还是可以呢?
修改
我尝试将importPackage()
与xe:objectData
数据源结合使用(根据Adrian和Paul的回答推荐),但我仍然接受了这个" {{1 }}"消息,现在只在我行代码中的不同位置unknown member 'edcom' in Java class 'java.lang,String'
。
我将切换回" com.edcom"打包并继续寻找更好的解决方案;不幸的是,他正在搜索字符串" de"在整个代码中产生接近12.000匹配;现在可以在大海捞针中找到真正的原因了
编辑#2:
看起来我们终于找到了可怕的" de"变量:它隐藏在计算的customControl属性中;我不知道为什么我过去几天所做的所有文件搜索都找不到这个。无论如何,知道在命名我们的ssjs变量时我们必须更加小心,这是非常好的。我从来没有想过ssjs变量名会干扰Java包中的TLD部分;我们可能会将其作为内部政策,我们的变量必须被命名为" importPackage(de.edcom)
"," vDe
"," {{ 1}}"而不只是短小写字母...
答案 0 :(得分:3)
可能你在其他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
。
答案 1 :(得分:1)
SSJS要求将变量放入范围。任何带有点的东西都将首先转到那些变量。听起来好像本地化将翻译存储在名为&#34; de&#34;的变量中,这可以解释您的问题。
可能importPackage(de.edcom)
然后使用return TOC.buildTOC();
可以解决问题。我会考虑更好的练习,但无论哪种方式,你都会冒着变量名冲突的风险。
就个人而言,我更倾向于使用控制器Java类支持每个XPage(我使用Jesse Gallagher的frostillicus框架,所以它总是可以通过变量pageController
访问),所以我的SSJS只需调用pageController.myMethod()
,然后避免所有名称冲突,并允许Java导入以确保我映射到正确的Java类。有更基本的方法,例如使用xe:dataObject位于每个XPage的顶部。