当前位置:软件学习 > 其它软件 >>

从远程服务器上拷贝邮件至本地库,报错java.lang.ClassCastException: lotus.domino.local.Database (java)

根据企业的需需求,需要从远程服务器上拷贝邮件至本地库,调用方法doc.copyToDatabase(db),报错java.lang.ClassCastException: lotus.domino.local.Database  .
跟踪代码发现在lotus.domino.sco.document 中有如下一段代码
public lotus.domino.Document copyToDatabase(Database database)
        throws NotesException
    {
        if(database == null)
            throw new NotesException(4405, JavaString.getString("missing_db_object"));
        TRACE_MSG("E:copyToDatabase(Database) " + database);
        lotus.domino.cso.Database database1 = (lotus.domino.cso.Database)database;
        Document document;
        synchronized(this)
        {
            sendUpdates();
            IDocument idocument = rDocument.copyToDatabase(database1.getRDatabase());
            if(idocument == null)
            {
                lotus.domino.Document document2 = null;
                return document2;
            }
            document = new Document(database1, idocument);
        }
        TRACE_MSG("X:copyToDatabase(Database) " + database);
        return document;
    }
怀疑就是红色的这一段报错。目前找不到解决办法。求教各位 --------------------编程问答-------------------- lotus为6.5,jdk 1.3,notes.jar和NCSO.jar都已加入。 --------------------编程问答-------------------- 实质上就是lotus.domino.local.Database 和 lotus.domino.cso.Database 的数据类型的转化
但由于这是lotus提供的jar中内部实现的,不知道怎么处理。 --------------------编程问答-------------------- 大家都没有碰到这种情况吗,还是我没有表述清楚。我在写清楚点。
目标:实现远程服务器端邮件收发的监控,将所有收发邮件采集到一特定数据库(如mailjrn.nsf),将所有邮件复制到客户端本地库,同时删除mailjrn.nsf库中的已复制的邮件。
现状:现在已实现了收发邮件的监控、采集,但在将远程数据库中的邮件拷贝至本地是出现了难题。
问题:用java获取远程邮件docServer的类型为lotus.domino.sco.Document,远程数据库dbServer的类型为lotus.domino.sco.Database,而本地邮件docClient的类型为lotus.domino.local.Document,本地数据库的类型为lotus.domino.local.Database.当取得远程邮件docServer后,调用docServer.copyToDataBase(dbClient)时,报错java.lang.ClassCastException: lotus.domino.cso.Database,通过反编译NCSO.jar包中的Document类发现,远程邮件的copyToDatabase(Database db)方法中,需要将db强制转换为lotus.domino.sco.Database,而程序打开的本地数据库的类型为lotus.domino.local.Database,所以出错。但从Lotus Domino Designer 6.5 help中又没有其他的文档拷贝接口的提供,所以一时无法解决。
求助:
1、有没有其他接口实现远程文档拷贝至本地库
2、有没有其他的方法实现这个目标

付相关代码
/**
   * 将文档集拷贝到目标库,并硬删除源库上的文档
   * @param dc
   * @param distDB
   */
  public void CopyDocumentCollection(DocumentCollection dc,Database distDB) {
    if (null == dc) {
      System.out.println("文档集为空");
      return;
    }
    int count = 0;
    try {
      
      count = dc.getCount();
    } catch (Exception e) {
      System.out.println("获取文档集的数目出错");
      e.printStackTrace();
    }
    Document doc = null;
//    Document docTemp = null;
    if (count > 0) {
      try {
        doc = dc.getFirstDocument();
        while (doc != null) {
          //拷贝至目标库
//          docTemp = (lotus.domino.local.Document)doc;
//          doc.copyAllItems(docTemp,true);
//          docTemp.save(true);
          System.out.println("doc's class = " + doc.getClass().getName());
//          System.out.println("docTemp's class = " + docTemp.getClass().getName());
//          docTemp.copyToDatabase(distDB);
          doc.copyToDatabase(distDB);
          //从源库上删除文档
          deleteHardDocument(doc);
          //doc.recycle();
          doc = dc.getNextDocument();
        }
      } catch (Exception e) {
        System.out.println("拷贝用户文档失败");
        System.out.println("e = " +e.getMessage()+" - " + e.getLocalizedMessage());
        e.printStackTrace();
      }
    }
  }


  /**
   * 在服务器端和客户端之间拷贝文档   *
   */
  public void copyDocumentFromServerToClient() {
    //服务器段准备
    Session sServer = null;
    Database serverDB = null;
    String mailServerPath = "mailjrn.nsf";
    DocumentCollection dc = null;
    DocumentCollection ClientDc = null;
    //  客户端准备
    Session sClient = null;
    Database clientDB = null;
    String mailClientPath = "test1.nsf";
    try {
      // 获取服务器端连接
      sServer = getSession();
      // 获取服务器端数据库
      serverDB = getUserDatabase(sServer, mailServerPath);
      // 获取服务器端数据库文档集
      dc = getUserDocCollection(serverDB);      
      //浏览服务器端数据库文档集
      System.out.println("==============服务器端数据库文档集=====================");
      viewDocumentCollection(dc);      
      //获取客户端连接
      sClient = getLocalSession();
      //获取客户端数据库
      clientDB= getUserDatabase(sClient,mailClientPath);
      //获取客户端文档集
      ClientDc = getUserDocCollection(clientDB);
      //浏览客户端端数据库文档集
      System.out.println("==============客户端端数据库文档集 before copy=====================");
      viewDocumentCollection(ClientDc);
      //拷贝文档集
      System.out.println("==============从服务器端拷贝数据至客户端=====================");
      CopyDocumentCollection(dc,clientDB);
//      CopyDocumentCollection(ClientDc,clientDB);
      
      System.out.println("==============客户端端数据库文档集 after copy =====================");
      ClientDc = getUserDocCollection(clientDB);
      // 读取文档
      viewDocumentCollection(ClientDc);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (null != dc) {
        try {
          dc.recycle();
          System.out.println("释放服务器端文档集");
        } catch (NotesException e) {
          System.out.println("释放服务器端文档集出错");
          e.printStackTrace();
        }
      }
      if (null != serverDB) {
        try {
          serverDB.recycle();
          System.out.println("释放服务器端用户数据库");
        } catch (NotesException e) {
          System.out.println("释放服务器端用户数据库出错");
          e.printStackTrace();
        }
      }
      if (null != sServer) {
        try {
          sServer.recycle();
          System.out.println("释放服务器端系统会话");
        } catch (NotesException e) {
          System.out.println("释放服务器端系统会话出错");
          e.printStackTrace();
        }
      }
      if (null != clientDB) {
        try {
          clientDB.recycle();
          System.out.println("释放客户端用户数据库");
        } catch (NotesException e) {
          System.out.println("释放客户端用户数据库出错");
          e.printStackTrace();
        }
      }
      if (null != sClient) {
        try {
          sClient.recycle();
          System.out.println("释放客户端系统会话");
        } catch (NotesException e) {
          System.out.println("释放客户端系统会话出错");
          e.printStackTrace();
        }
      }
      if (null != ClientDc) {
        try {
          ClientDc.recycle();
          System.out.println("释放客户端文档集");
        } catch (NotesException e) {
          System.out.println("释放客户端文档集出错");
          e.printStackTrace();
        }
      }
      try {
        NotesThread.stermThread();
      }catch(Exception e) {
        System.out.println("释放Notes");
        e.printStackTrace();
      }
    }  
    
  }

public static void main(String[] args) {
    ConnectLotus cl = new ConnectLotus();
    cl.copyDocumentFromServerToClient();  
}

执行结果:
已打服务器端会话
打开用户数据库成功
==============服务器端数据库文档集=====================
************************* 以下打开文档项目(items)信息
mailjrn.nsf 标题 :teset11 文本 :test11
************************* 以下打开文档项目(items)信息
mailjrn.nsf 标题 :1341 文本 :
已打开本地会话
打开用户数据库成功
==============客户端端数据库文档集 before copy=====================
************************* 以下打开文档项目(items)信息
C:\Program Files\lotus\notes\data\test1.nsf 标题 :teset11 文本 :test11
java.lang.ClassCastException: lotus.domino.local.Database
at lotus.domino.cso.Document.copyToDatabase(Unknown Source)
at com.dgtel.lotus.ConnectLotus.CopyDocumentCollection(ConnectLotus.java:513)
at com.dgtel.lotus.ConnectLotus.copyDocumentFromServerToClient(ConnectLotus.java:815)
at com.dgtel.lotus.ConnectLotus.main(ConnectLotus.java:987)
==============从服务器端拷贝数据至客户端=====================
doc's class = lotus.domino.cso.Document
拷贝用户文档失败
e = lotus.domino.local.Database - lotus.domino.local.Database
==============客户端端数据库文档集 after copy =====================
************************* 以下打开文档项目(items)信息
C:\Program Files\lotus\notes\data\test1.nsf 标题 :teset11 文本 :test11
释放服务器端文档集
释放服务器端用户数据库
释放服务器端系统会话
释放客户端用户数据库
释放客户端系统会话
释放客户端文档集
补充:企业软件 ,  Lotus
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,