从远程服务器上拷贝邮件至本地库,报错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