Xpages运行时将java包名称解释为String对象

时间:2016-06-10 08:58:03

标签: xpages javabeans xpages-ssjs

从我们当前的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}}"而不只是短小写字母...

2 个答案:

答案 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的顶部。