lotus.domino.local.Item无法强制转换为lotus.domino.RichTextItem

时间:2017-06-13 10:13:47

标签: xpages richtext

我尝试将文件放入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;
   }
}

1 个答案:

答案 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