在Domino Java Agent中使用枚举单例编码模式

时间:2013-07-01 23:25:54

标签: java lotus-notes lotus-domino

所以这是我试图运行的非常简化的Lotus Domino Java代理代码......

import lotus.domino.*;

enum SingletonTest { 
    INSTANCE;

    public void helloWorld() {
        System.out.println("Hello World");
    }
}

public class JavaAgent extends AgentBase {

    public void NotesMain() {

        try {
            System.out.println("Started");
            SingletonTest.INSTANCE.helloWorld();
            System.out.println("Done");

        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

但是当我尝试运行它时,这就是Java控制台上出现的内容......

Started
Exception in thread "AgentThread: JavaAgent" java.lang.VerifyError: JVMCFRE028 ldc* bytecode must reference a constant; class=, method=valueOf(Ljava/lang/String;)LSingletonTest;, pc=0
    at java.lang.ClassLoader.defineClassImpl(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:275)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:212)
    at lotus.domino.AgentLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:626)
    at JavaAgent.NotesMain(JavaAgent.java:17)
    at lotus.domino.AgentBase.runNotes(Unknown Source)
    at lotus.domino.NotesThread.run(Unknown Source)

我正在为我的代理使用Java 1.6。我正在使用v8.5.3 FP3和我的notes.ini我有...

JavaCompilerTarget = CurrentJavaVersion

那么我做错了什么?

使用包含代码的枚举的IBM Java版本加载器是否存在问题?

这是我试图遵循的单例编码模式......

https://stackoverflow.com/a/71399/2530065

编辑: 我可能应该添加我作为Notes客户端代理运行它“Trigger:On event:Action Menu selection”和“Target:None”。

EDIT2: 所以我使用相同的IBM JRE / JVM在独立的Java程序中测试了这个确切的代码,代码完美无缺。我似乎无法让它在Notes客户端中作为Java代理工作。

2 个答案:

答案 0 :(得分:1)

  1. 打开Designer偏好设置并选择编译器设置。

    Preferences

  2. 点击"配置项目特定设置..."

  3. 选择项目,然后单击“确定”。

    select project

  4. 将设置更改为1.6和默认合规性设置。

    compliance settings

  5. 单击“确定”。您应该收到一些提示,选择默认值。然后再次打开并保存代理以重新编译它。

  6. 使用你的代码我做了这个并运行它没有错误。

答案 1 :(得分:1)

最后我发现从...

更改了NOTES.INI设置JavaCompilerTarget

JavaCompilerTarget = CurrentJavaVersion

...到...

JavaCompilerTarget = 1.6

从头开始重新创建代理修复了问题。

对于Java代理,似乎代理文档中有两个字段控制源Java和目标Java版本。

这些是$ JavaCompilerSource和$ JavaCompilerTarget。

在创建Java代理时设置它们。这些字段的值取决于创建代理时NOTES.INI JavaCompilerTarget条目的值。在创建代理程序并编辑或重新编译代理程序后更改NOTES.INI条目无效。

如果我在NOTES.INI变量“JavaCompilerTarget”设置为“CurrentJavaVersion”时创建Java代理,则字段“$ JavaCompilerTarget”将设置为值“CurrentJ”,字段“$ JavaCompilerSource”将设置为值“1.6”。

如果我在NOTES.INI变量“JavaCompilerTarget”设置为“1.6”时创建Java代理,则字段“$ JavaCompilerTarget”设置为值“1.6”,字段“$ JavaCompilerSource”设置为值“1.6”。

如果此特定代理的“$ JavaCompilerTarget”字段的值为“CurrentJ”,那么我将获得异常。

如果我重新创建相同的代理并且其“$ JavaCompilerTarget”字段的值为“1.6”,那么我不会得到异常。

如果我在NOTES.INI变量设置为“1.5”时重新创建此代理,则两个代理字段值都设置为“1.5”,代理运行时没有任何错误。

如果我使用ytria scanEZ来更改已损坏的代理(具有$ JavaCompilerTarget =“CurrentJ”字段的代理),那么该值为“1.6”,然后我打开并在设计器中重新保存代理,它不再抛出异常。如果我将字段值更改回“CurrentJ”并重新保存代理,则会再次抛出异常。

所以似乎有一个Java代理字段$ JavaCompilerTarget =“CurrentJ”不好,当你有一个JavaCompilerTarget = CurrentJavaVersion的NOTES.INI条目时会发生这种情况。

我不知道为什么这会改变JVM行为,但它在8.5.3 FP3上为我做了。