Xpages 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

我试图将一个文件放入richtext,但它崩溃了! 在我的第一段代码中,我尝试直接使用“getFirstItem”,第一次还可以,但现在我再次尝试使用它,它崩溃了。 第二次我带着一个对象经过,它发现我的对象不是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;
   }
}
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
块或将其保留。它不会改变结果