不能使用 sbt modify/remove 来自 ActivityNode 的字段

Can't modify/remove a field from an ActivityNode using sbt

我创建了一个 ActivityNode(一个条目),我可以使用

添加自定义字段
setFields(List<Field> newListField)

功能。

但是

我无法修改这些字段。 (在这种情况下我尝试修改名为 LIBENTITE 的字段的值)

FieldList list = myEntry.getTextFields();
List<Field> updatedList = new ArrayList<Field>();

//I add each old field in the new list, but I modify the field LIBENTITE
for(Field myField : list){
    if(myField.getName().equals("LIBENTITE")){
        ((TextField)myField).setTextSummary("New value");
    }
    updatedList.add(myField);
}

myEntry.setFields(updatedList);
activityService.updateActivityNode(myEntry);

此代码应将旧的字段列表替换为新的字段列表,但我在 IBM 连接中的 myEntry 的自定义字段 LIBENTITE 中看不到任何变化。

所以我尝试创建一个新的字段列表,不是修改我的字段而是添加一个新字段:

for(Field myField:list){
    if(!myField.getName().equals("LIBENTITE")){
        updatedList.add(myField);
    }
}
Field newTextField = new TextField("New Value");
newTextField .setFieldName("LIBENTITE");
updatedList.add(newTextField );

这段代码只是在 myEntry 中添加新字段。我看到的是其他自定义字段没有改变,我现在有两个名为 LIBENTITE 的自定义字段,一个具有旧值,第二个具有新值,在 myEntry 中。

所以我想也许如果我清除旧的字段列表,然后添加新的字段,它会起作用。 我尝试了这两个功能

myEntry.clearFieldsMap();

myEntry.remove("LIBENTITE");

但其中 none 似乎有效,我仍然无法使用 SBT 从 myEntry 中删除自定义字段。

有什么建议吗?

我有两个建议,因为我有(或有)类似的问题:

如果要更新 activity 节点中的现有文本字段,必须调用 node.setField(fld) 来更新节点对象中的字段。

我的工作应用程序的代码片段,我正在其中更新包含(计算的)开始时间的文本字段:

ActivityNode node = activityService.getActivityNode(id);
node.setTitle(formatTitle());      // add/update start and end time in title
boolean startFound = false;
   // ...                        
FieldList textfields =node.getTextFields();
Iterator<Field> iterFields = textfields.iterator();
while (iterFields.hasNext()) {
    TextField fld = (TextField) iterFields.next();
    if (fld.getName().equals(Constants.FIELDNAME_STARTTIME)) {
        fld.setTextSummary(this.getStartTimeString());       // NOTE: .setFieldValue does *not* work
        node.setField(fld);                // write updated field back. This seems to be the only way updating fields works
        startFound=true; 
    }
} 

如果没有该名称的字段,我将创建一个新字段(这就是我使用 startFound 布尔变量的原因)。

我认为 node.setField(fld) 应该可以解决问题。如果没有,可能有办法回避这个问题:

您可以访问在其中解析的基础 DOM 对象。您可以使用它来调整 DOM 对象,该对象最终将被写回 Connections。 我不得不使用它,因为 SBT SDK 中似乎还有另一个讨厌的错误:如果您在文本字段中阅读 没有值 ,并将其写回,将抛出错误。看起来 DOM 对象缺少一些必需的节点,因此您必须自己创建它们以避免错误。

一些代码来演示这一点:

// ....
} else if (null == fld.getTextSummary()) {     // a text field without any contents. Which is BAD!

        // there is a bug in the SBT API: if we read a field which has no value
        // and try to write the node back (even without touching the field) a NullPointerException
        // will be thrown. It seems that there is no value node set for the field. We
        // can't set a value with fld.setTextSummary(), the error will still be thrown.
        // therefore we have to remove the field, and - optionally - we  set a defined "empty" value
        // to avoid the problem.
    // node.remove(fld.getName());                 // remove the field -- this does *not* work! At least not for empty fields
        // so we have to do it the hard way: we delete the node of the field in the cached dom structure
    String fieldName = fld.getName();
    DeferredElementNSImpl fldData = (DeferredElementNSImpl) fld.getDataHandler().getData();
    fldData.getParentNode().removeChild(fldData);        // remove the field from the cached dom structure, therefore delete it
    // and create it again, but with a substitute value
    Field newEmptyField = new TextField (Constants.FIELD_TEXTFIELD_EMPTY_VALUE); // create a field with a placeholder value
     newEmptyField.setFieldName(fieldName);
    node.setField(newEmptyField);                              
}

希望对您有所帮助。

为了让 post 不至于无人问津,我写下了最初问题评论中的答案:

"currently, there is no solution to this issue, the TextFields are read-only map. we have the issue recorded on github.com/OpenNTF/SocialSDK/issues/1657"