lotus.domino.local.Item нельзя преобразовать в lotus.domino.RichTextItem

Я пытаюсь поместить файл в форматированный текст, но он вылетает! В моем первом коде я пытаюсь использовать непосредственно "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. Это моя проблема. Я не понимаю почему, потому что в моей области это richtext! Для этого предмет не может сделать:

rtiNew = (lotus.domino.RichTextItem) item1;

потому что item1 не будет richtext!!! Я пытался взять все поля и передать элемент одно за другим, и он никогда не передавался в объект obj для lotus.domini.RichTextItem....

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 ответ

Пара вещей. Прежде всего, я бы настроил метод класса 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
                }
            }
        }
    }
}

Во-вторых, я бы удалил блоки 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 будет автоматически перерабатываться, и все, что с ним связано (так что нет необходимости перерабатывать дБ, не говоря уже о сеансе! хорошее правило - не перерабатывать то, что вы не создавали), но неплохо сохранять привычку следить на что ты делаешь экземпляр. Если бы это был цикл со многими документами, вы бы точно хотели это сделать. Если вы также работали со многими предметами, вы хотели бы утилизировать их как можно раньше. В любом случае, учитывая объем кода, этого достаточно. Очевидно, вы бы позвонили DominoUtil.recycle прямо из блока try. Если у вас есть несколько объектов, вы можете перерабатывать их одновременно, возможно, перечислив их в обратном порядке, в котором вы их установили (например, DominoUtil.recycle(item, doc, view)).

Кроме того, я думаю, что вам не хватает проверки на предмет, если это не RichTextItem - и поэтому не может быть брошен. Я положил комментарий, где я думаю, что вы должны решить, что делать, прежде чем продолжить. Если вы позволите этому так и продолжите выполнение кода, вы получите код, выдающий ошибку. Всегда лучше перехватить исключение более низкого уровня и повторно выдать исключение более высокого уровня (вы не хотите, чтобы конечный пользователь знал больше, чем необходимо знать). В этом случае я пошел на самую простую вещь: завернутый NotesException в FacesException,

Другие вопросы по тегам