Java 运行IBM代码示例时发生ClassNotFoundException

Java 运行IBM代码示例时发生ClassNotFoundException,java,lotus-notes,lotus-domino,Java,Lotus Notes,Lotus Domino,我最终会在notes文档中编写一些自定义数据。但在此之前,我想看看它是如何工作的,所以我从IBM知识中心复制/粘贴了关于在两个单独的代理中替换/getItemValueCustomData的示例 问题是,当我尝试读取自定义数据时,读取代理会引发该异常: java.lang.ClassNotFoundException: customData.IntIntString at java.lang.Class.forName(Class.java:291) at java.io.Obj

我最终会在notes文档中编写一些自定义数据。但在此之前,我想看看它是如何工作的,所以我从IBM知识中心复制/粘贴了关于在两个单独的代理中替换/getItemValueCustomData的示例

问题是,当我尝试读取自定义数据时,读取代理会引发该异常:

java.lang.ClassNotFoundException: customData.IntIntString
    at java.lang.Class.forName(Class.java:291)
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:619)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1609)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1768)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:364)
    at lotus.domino.local.Document.getItemValueCustomData(Unknown Source)
    at JavaAgent.NotesMain(JavaAgent.java:14)
    at lotus.domino.AgentBase.runNotes(Unknown Source)
    at lotus.domino.NotesThread.run(Unknown Source)
代码如下:

写入代理:

import customData.IntIntString;
import lotus.domino.*;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();

            IntIntString iis = new IntIntString();
            iis.setData(1, 2, "String1");

            Document doc = agentContext.getDocumentContext();
            doc.replaceItemValueCustomData("IntIntStringItem", "IntIntStringType", iis);
            doc.save();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
阅读代理:

import intIntString.IntIntString;
import lotus.domino.*;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();

            Document doc = agentContext.getDocumentContext();
            if (doc.hasItem("IntIntStringItem")) {
                IntIntString iis = (IntIntString) doc.getItemValueCustomData("IntIntStringItem", "IntIntStringType");
                iis.show();
            } else {
                System.out.println("No item IntIntStringItem in document");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
IntentString类:

package customData;

import java.io.Serializable;

public class IntIntString implements Serializable {

    private static final long serialVersionUID = 6875473472063311349L;

    private int int1;
    private int int2;
    private String string1;

    public void setData(int i1, int i2, String s1) {
        int1 = i1;
        int2 = i2;
        string1 = s1;
    }

    public void show() {
        System.out.println("Int1 = " + int1);
        System.out.println("Int2 = " + int2);
        System.out.println("String1 = " + string1);
    }
}
代理写入的字节数:

.  I  n  t  I  n  t  S  t  r  i  n  g  T  y  p  e  .  .  .
10 49 6E 74 49 6E 74 53 74 72 69 6E 67 54 79 70 65 AC ED 00 
.  s  r  .  .  c  u  s  t  o  m  D  a  t  a  .  I  n  t  I
05 73 72 00 17 63 75 73 74 6F 6D 44 61 74 61 2E 49 6E 74 49 
n  t  S  t  r  i  n  g  _  j  .  .  .  .  .  .  .  .  .  I
6E 74 53 74 72 69 6E 67 5F 6A 96 B1 EC F4 8D F5 02 00 03 49 
.  .  i  n  t  1  I  .  .  i  n  t  2  L  .  .  s  t  r  i
00 04 69 6E 74 31 49 00 04 69 6E 74 32 4C 00 07 73 74 72 69 
n  g  1  t  .  .  L  j  a  v  a  /  l  a  n  g  /  S  t  r
6E 67 31 74 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72
i  n  g  ;  x  p  .  .  .  .  .  .  .  .  t  .  .  S  t  r
69 6E 67 3B 78 70 00 00 00 01 00 00 00 02 74 00 07 53 74 72 
i  n  g  1
69 6E 67 31    
我是错过了什么还是喝醉了

链接到示例:


编辑:尝试在“代理”类中定义“IntIntString”类,但没有成功,也没有将该类放入.jar并导入


编辑2:正如评论中所建议的,我试图在代理中声明类public。由于某种原因,当我尝试在代理中实现Serializable时,我做到了。还是有同样的例外

然后我尝试在“customData”包中的一个单独的文件中声明它为public(因为公共类需要自己的文件),但这也不起作用

还尝试在以读取模式打开文档时读取字段。我得到了该异常,并删除了该字段(从文档属性中看到):

如果字段读/写不正确,则数据类型应匹配

代码已更新

以下是我所做的

  • 创建了一个名为WriteAgent的Java代理
  • 在Src->(默认包)下,创建了一个名为IntIntString.java的新类
  • 按原样粘贴到代码中
  • 同样在Src->(默认包)下,创建了一个名为JavaAgent.java的新类
  • 粘贴到WriteAgent类中,而不导入customData
    编译并运行,没有错误,并更新了文档。

    从自定义类IntIntString创建一个jar文件

    import java.io.Serializable;
    
    // Define custom data
    public class IntIntString implements Serializable {
        private static final long serialVersionUID = 1L;
        int int1;
        int int2;
        String string1;
    
        public void setData(int i1, int i2, String s1) {
            int1 = i1;
            int2 = i2;
            string1 = s1;
        }
    
        public void show() {
            System.out.println("Int1 = " + int1);
            System.out.println("Int2 = " + int2);
            System.out.println("String1 = " + string1);
        }
    }
    
    并将jar文件放入文件夹中

    • domino/jvm/lib/ext(domino服务器-用于后端和runOnServer代理)
    • notes/jvm/lib/ext(notes客户端-用于客户端启动的代理)

    通过这种方式,ObjectInputStream可以找到自定义类IntIntString,因为它在代理的JVM中全局可用。这是IBM的replaceItemValueCustomData/getItemValueCustomData文档中缺少的部分。

    问题不清楚。有什么问题?你在做什么来解决它?你在哪里卡住了?正如我在问题的第五行所说的,问题是IBM提供的代码示例引发了异常。这意味着没有定义/找到“IntIntString”类。我不知道“IBMDunk”,但是您应该将该类直接导入到您的项目中,或者IBM有一个关于所有这些类的jar文件,您可以导入它。我想你应该从谷歌搜索“IntIntString.class”。@pilkington“intintintstring”类与代理定义在同一个文件中。我不明白为什么找不到它。@Jouramie你说得对,我现在看到了那门课。您可以尝试在代理类中定义IntIntString类吗?可能我在问题中没有指定它,但异常是由读取代理引发的。我只是加了它。尽管我努力,我只能得到和你一样的结果。据我所知,不是我的代理找不到该类,而是调用getItemValueCustomData()时失败的文档类。它使用了一个无聊的基本类型(我尝试了Integer)。我没有办法在这里进行测试,但我想知道您是否将自定义类放入了一个.jar(而不是脚本库)中,这样做是否有效?我尝试直接在代理中导入.jar,但仍然得到相同的异常。我将看看是否可以导入类文件。此外,当我将“IntIntString”类从customData包移动到defaut包时,Document类似乎会在customData文件中不断搜索它,即使在我清除/生成所有文件时也是如此。看起来某个地方有刷新问题。它成功了,非常感谢。这真的需要添加到文档中。我对这个答案投了赞成票,因为它听起来对我来说是正确的。我认为应该解决这个问题。另一方面,这可能不是最好的长期解决方案。在jvm/lib/ext中管理jar可能很困难。例如,如何确保所有Domino服务器上都有相同版本的jar?就我个人而言,我会首先避免这个问题。与序列化Java对象(replaceItemValueCustomData)不同,我会找到一种不同的方法来存储数据(JSON、XML、单独的Notes项?)。我可能会将数据存储在单独的Notes项中,并创建Function rebuild我的对象。无论如何,一半的数据已经以这种方式存储,因为我需要它们在视图中。这仍然不是我想听到的答案,但它解决了问题。@Dave:我完全同意。我不会在生产中使用…自定义数据。如果客户端代理使用它,情况会更糟。然后,您必须确保每个Notes客户机上都有这个jar。。。这可能就是为什么在互联网上找不到关于这个函数的信息的原因。这就是我在建议将这个类放在一个.jar文件中时的想法。不幸的是,我无法测试它来确定。
    import java.io.Serializable;
    
    // Define custom data
    public class IntIntString implements Serializable {
        private static final long serialVersionUID = 1L;
        int int1;
        int int2;
        String string1;
    
        public void setData(int i1, int i2, String s1) {
            int1 = i1;
            int2 = i2;
            string1 = s1;
        }
    
        public void show() {
            System.out.println("Int1 = " + int1);
            System.out.println("Int2 = " + int2);
            System.out.println("String1 = " + string1);
        }
    }