2016-07-28 35 views
3

我最终会在笔记文档中写入一些自定义数据。但在此之前,我想知道它是如何工作的,所以我从IBM知识中心复制/粘贴了关于两个分离代理中的replace/getItemValueCustomData的示例。运行IBM代码示例时出现ClassNotFoundException

问题是,当我尝试读取自定义数据,读取代理抛出该异常:

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(); 
     } 
    } 
} 

IntIntString类:

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); 
    } 
} 

字节wrotes由代理:

. 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  

难道我错过的东西或者是IBM喝醉了吗?

链接到示例:replaceItemValueCustomData method,getItemValueCustomData method


编辑:试图在“代理”类来定义“IntIntString”类,但没有工作,也没有把类的.jar和导入。


编辑2:正如评论中所建议的,我试图在代理中声明类为公共类。出于某种原因,当我尝试过我必须在代理中实现Serializable时,我所做的是。仍然有同样的例外。

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

还尝试读取文档以读取模式打开时的字段。我得到的异常,并删除领域(见从文件属性):

NotesException: Supplied Data type name does not match stored CustomData type 
    at lotus.domino.local.Document.NgetItemValueCustomData(Native Method) 
    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) 

接缝,该字段不读/写正确,数据类型应该匹配。

代码已更新。

+0

问题不清楚。问题是什么?你在做什么来解决它,你卡在哪里? –

+0

正如我在问题的第五行所说的那样,问题在于IBM提供的代码示例抛出异常。 –

+0

这意味着“IntIntString”类未定义/找到。我不知道“IBM喝醉了”,但是您应该直接将该类导入到您的项目中,或者IBM有一个关于所有这些类的jar文件,您可以导入它。我认为你应该看看谷歌的“IntIntString.class”搜索。 – pilkington

回答

4

创建自定义类IntIntString

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文件,并把jar文件到文件夹

  • 多米诺/ JVM/lib/ext目录(Domino服务器 - 为后端和runOnServer代理)
  • 笔记/ jvm/lib/ext(Notes Client - 用于客户端启动的代理)

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

+0

它的工作,非常感谢。这确实需要添加到文档中。 –

+1

我投这个答案,因为它听起来是对我来说。我认为它应该解决问题。另一方面,这可能不是最好的长期解决方案。在jvm/lib/ext中管理jar可能很困难。例如,您如何确保您在所有Domino服务器上拥有相同版本的jar?就我个人而言,我会首先避免这个问题。而不是序列化Java对象(replaceItemValueCustomData),我会找到一种不同的方式来存储数据(JSON,XML,单独的Notes项目?)。 –

+0

我可能会将数据存储在单独的Notes项目中,并创建函数重建我的对象。反正一半的数据已经以这种方式存储,因为我需要它们在视图中。这仍然不是我想要的答案,但它解决了问题。 –

2

这里就是我没有...

  1. 创建一个Java代理调用WriteAgent
  2. src下 - >(默认包),创建了一个名为IntIntString.java新类
  3. 粘贴在你的代码as
  4. 再次在Src - >(默认包)下创建一个名为JavaAgent的新类。java
  5. 粘贴到您的WriteAgent类中,而不导入到customData;

编译并运行时没有错误并更新了文档。

+0

也许我没有在问题中指定它,但是读取代理抛出异常。刚添加它。 –

+0

尽我所能,我只能得到和你一样的结果。据我可以告诉它不是我的代理无法找到类,它是您调用getItemValueCustomData()时失败的Document类。它使用了一种无聊的基本类型(我试过Integer)。我没有办法在这里测试,但是我想知道如果你把你的自定义类放到一个.jar(而不是脚本库)中是否会起作用? – Duston

+0

我试图直接在代理中导入.jar,但我仍然得到相同的异常。我会看看是否可以导入类文件。 –

相关问题