Xpages lotus.domino.local.Item无法强制转换为lotus.domino.RichTextItem
我试图将一个文件放入richtext,但它崩溃了! 在我的第一段代码中,我尝试直接使用“getFirstItem”,第一次还可以,但现在我再次尝试使用它,它崩溃了。 第二次我带着一个对象经过,它发现我的对象不是richtextItem(instanceof) 我不明白。 我收到一条消息:“lotus.domino.local.Item不能强制转换为lotus.domino.RichTextItem”? 你能帮我吗Xpages lotus.domino.local.Item无法强制转换为lotus.domino.RichTextItem,xpages,richtext,Xpages,Richtext,我试图将一个文件放入richtext,但它崩溃了! 在我的第一段代码中,我尝试直接使用“getFirstItem”,第一次还可以,但现在我再次尝试使用它,它崩溃了。 第二次我带着一个对象经过,它发现我的对象不是richtextItem(instanceof) 我不明白。 我收到一条消息:“lotus.domino.local.Item不能强制转换为lotus.domino.RichTextItem”? 你能帮我吗 public void copieFichierDansRichText(Stri
public void copieFichierDansRichText(String idDocument, String nomRti, File file,
String nameFichier, String chemin) throws NotesException {
lotus.domino.Session session = Utils.getSession();
lotus.domino.Database db = session.getCurrentDatabase();
lotus.domino.Document monDoc = db.getDocumentByUNID(idDocument);
lotus.domino.RichTextItem rtiNew = null;
try {
try {
if (monDoc != null) {
// if (monDoc.getFirstItem(nomRti) != null) {
// rtiNew = (lotus.domino.RichTextItem)
// monDoc.getFirstItem(nomRti);
// } else {
// rtiNew = (lotus.domino.RichTextItem)
// monDoc.createRichTextItem(nomRti);
// }
Object obj = null;
if (monDoc.getFirstItem(nomRti) != null) {
obj = monDoc.getFirstItem(nomRti);
if (obj instanceof lotus.domino.RichTextItem) {
rtiNew = (lotus.domino.RichTextItem) obj;
}
} else {
obj = monDoc.createRichTextItem(nomRti);
if (obj instanceof lotus.domino.RichTextItem) {
rtiNew = (lotus.domino.RichTextItem) obj;
}
}
PieceJointe pieceJointe = new PieceJointe();
pieceJointe = buildPieceJointe(file, nameFichier, chemin);
rtiNew.embedObject(EmbeddedObject.EMBED_ATTACHMENT, "", pieceJointe.getChemin()
+ pieceJointe.getNomPiece(), pieceJointe.getNomPiece());
monDoc.computeWithForm(true, false);
monDoc.save(true);
}
} finally {
rtiNew.recycle();
monDoc.recycle();
db.recycle();
session.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
}
编辑:我试图用你的建议修改我的代码,但这些项目从来没有像richtextitem那样考虑周到。这是我的问题。我不明白为什么,因为在我的领域它是一个丰富的文本!对于它,该项不能执行以下操作:
rtiNew = (lotus.domino.RichTextItem) item1;
因为item1不是richtext!!!
我试图获取所有字段并一个接一个地传入该项,但它从未进入lotus.domini.RichTextItem的obj实例
Vector items = doc.getItems();
for (int i=0; i<items.size(); i++) {
// get next element from the Vector (returns java.lang.Object)
Object obj = items.elementAt(i);
// is the item a RichTextItem?
if (obj instanceof RichTextItem) {
// yes it is - cast it as such // it never go here !!
rt = (RichTextItem)obj;
} else {
// nope - cast it as an Item
item = (Item)obj;
}
}
Vector items=doc.getItems();
对于(inti=0;i一些事情。首先,我将设置一个util类方法,以更简洁的方式处理对象回收:
public enum DominoUtil {
;
public static void recycle(Base... bases) {
for (Base base : bases) {
if (base != null) {
try {
base.recycle();
} catch (Exception e) {
// Do nothing
}
}
}
}
}
其次,我将删除reduntants try/catch块,并将其简化如下:
private void copieFichierDansRichText(String idDocument, String nomRti, File file,
String nameFichier, String chemin) {
Session session = DominoUtils.getCurrentSession();
Database db = session.getCurrentDatabase();
Document monDoc = null;
try {
monDoc = db.getDocumentByUNID(idDocument);
Item item = monDoc.getFirstItem(nomRti);
if (item == null) {
item = monDoc.createRichTextItem(nomRti);
} else if (item.getType() != Item.RICHTEXT) {
// The item is not a rich text item
// What are you going to do now?
}
RichTextItem rtItem = (RichTextItem) item;
PieceJointe pieceJointe = new PieceJointe();
pieceJointe = buildPieceJointe(file, nameFichier, chemin);
rtItem.embedObject(EmbeddedObject.EMBED_ATTACHMENT, "", pieceJointe.getChemin()
+ pieceJointe.getNomPiece(), pieceJointe.getNomPiece());
monDoc.computeWithForm(true, false);
monDoc.save(true);
} catch (NotesException e) {
throw new FacesException(e);
} finally {
DominoUtil.recycle(monDoc);
}
}
最后,除了monDoc,您不需要回收任何其他东西。实际上,会话
会自动回收,下面的任何东西也会自动回收(所以不需要回收数据库,更不用说会话了!好的规则是不要回收您没有实例化的东西),但保持关注实例化内容的习惯并不是坏事。如果它是一个包含许多文档的循环,您肯定会希望这样做。如果您也处理了许多项目,您会希望尽早回收它们。无论如何,考虑到代码的范围,这样就足够了。显然,您会调用dominutil.recycle
直接从try块中回收。如果您有多个对象,可以通过按设置的相反顺序列出它们(例如,dominutil.recycle(项目、文档、视图)
)一次回收它们
此外,我认为您错过的是对该项的检查,以防它不是RichTextItem
,因此无法进行强制转换。我将一条注释放在我认为您应该在继续之前决定做什么的位置。如果您让它这样做并让代码继续,则代码将抛出错误。捕获较低级别的异常总是更好的d重新抛出一个更高的值(您不希望最终用户知道的比需要知道的更多)。在这种情况下,我只做了最简单的事情:在FacesException中包装NotesException
这是在XPages上下文中运行的吗?我不认识Utils.getSession()
call尝试处理:会话:公共静态对象getVariableResolver(字符串nomVariable){FacesContext ctx=FacesContext.getCurrentInstance();返回ctx.getApplication().getVariableResolver().resolveVariable(ctx,nomVariable);}公共静态会话getSession(){return(会话)getVariableResolver(“会话”)}好的,您可以看看我发布的答案。我在示例中使用了一个快捷方式:dominutils.getCurrentSession()
什么是“lotus.domino.local.item”?它不同于“lotus.domino.item”?为什么?我从来不会发送一个没有参数richtext的字段如果您有信心,那么只需删除else
块或将其保留。它不会改变结果