我尝试将文件放入richtext但它崩溃了! 在我的第一个代码中,我尝试直接使用“getFirstItem”,在第一次它没问题,但现在我尝试再次使用它,它崩溃了。 在第二次我传递一个对象,它发现我的obj不是richtextItem(instanceof)???
我不明白。 我有消息:“lotus.domino.local.Item不能转换为lotus.domino.RichTextItem”? 你能帮帮我吗?
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;
}
}
答案 0 :(得分:0)
有几件事。首先,我将设置一个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,你不需要回收任何其他东西。实际上Session
将被自动回收,并且任何东西都在下面(所以不需要回收数据库,更不用说会话了!,好的规则是不回收你没有实例化的东西),但它&保持注意你实例化的习惯并不坏。如果它是一个包含许多文档的循环,那么您肯定希望这样做。如果您还使用过许多物品,您可能希望尽早回收它们。无论如何,考虑到代码的范围,它就足够了。显然你可以直接从try块调用DominoUtil.recycle
。如果您有多个对象,可以立即回收它们,方法是按照您设置的相反顺序列出它们(例如DominoUtil.recycle(item, doc, view)
)。
此外,我认为你错过的是检查项目,以防它不是RichTextItem
- 因此无法投出。我发表评论,我认为在继续之前你应该决定做什么。如果你喜欢它并让代码继续下去,那么代码就会抛出错误。总是更好地捕获较低级别的异常并重新抛出较高的异常(您不希望最终用户知道更多知道)。在这种情况下,我选择了最简单的事情:在NotesException
中包裹FacesException
。