Rtc ImmutablePropertyException在更改枚举字段';通过rationalteamconcertapi实现的价值

Rtc ImmutablePropertyException在更改枚举字段';通过rationalteamconcertapi实现的价值,rtc,Rtc,在我正在使用的RTC API工具的新RTC工作项中,通过更改某些基于枚举的字段来解决此问题 基本上,我第一次更改字段时会得到一个ImmutablePropertyException,但下一次它会正常工作 希望排除异常。我正在使用RTC实际返回给我的值作为字段的有效枚举值 分配RTC工作项字段:odc.impact字段值-> 完整性[odc.impact.literal.l4] 异常:无法分配值, 即使在枚举列表中找到它:[未分配, 可安装性、标准、完整性] com.ibm.team.reposi

在我正在使用的RTC API工具的新RTC工作项中,通过更改某些基于枚举的字段来解决此问题

基本上,我第一次更改字段时会得到一个ImmutablePropertyException,但下一次它会正常工作

希望排除异常。我正在使用RTC实际返回给我的值作为字段的有效枚举值

分配RTC工作项字段:odc.impact字段值-> 完整性[odc.impact.literal.l4]

异常:无法分配值, 即使在枚举列表中找到它:[未分配, 可安装性、标准、完整性]

com.ibm.team.repository.common.internal.ImmutablePropertyException位于 com.ibm.team.repository.common.internal.util.ItemUtil$ProtectAdapter.notifyChanged(ItemUtil.java:2070) 在 org.eclipse.emf.common.notify.impl.basicontifierimpl.eNotify(basicontifierimpl.java:380) 在 com.ibm.team.repository.common.model.impl.StringExtensionEntryImpl.setTypedValue(StringExtensionEntryImpl.java:178) 在 com.ibm.team.repository.common.model.impl.StringExtensionEntryImpl.setValue(StringExtensionEntryImpl.java:360) 位于org.eclipse.emf.common.util.BasicEMap.putEntry(BasicEMap.java:303) 位于org.eclipse.emf.common.util.BasicEMap.put(BasicEMap.java:584) org.eclipse.emf.common.util.BasicEMap$DelegatingMap.put(BasicEMap.java:799) 在 com.ibm.team.repository.common.model.impl.ItemImpl.setStringExtension(ItemImpl.java:1228) 在 com.ibm.team.workitem.common.internal.model.impl.WorkItemImpl.setEnumeration(WorkItemImpl.java:3779) 在 com.ibm.team.workitem.common.internal.model.impl.WorkItemImpl.setValue(WorkItemImpl.java:2915) 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:95) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 位于java.lang.reflect.Method.invoke(Method.java:620) com.ibm.team.repository.common.internal.util.ItemStore$ItemInvocationHandler.invoke(ItemStore.java:597) 位于com.sun.proxy.$Proxy18.setValue(未知源) com.rtc.vda.WorkItemInitialization.setAttributeValuex(WorkItemInitialization.java:237) 在 com.rtc.vda.WorkItemInitialization.setAttributeValue(WorkItemInitialization.java:210) 在 com.rtc.vda.WorkItemInitialization.execute(WorkItemInitialization.java:186) 在 com.ibm.team.workitem.client.WorkItemOperation.execute(WorkItemOperation.java:85) 在 com.ibm.team.workitem.client.WorkItemOperation.doRun(WorkItemOperation.java:272) 在 com.ibm.team.workitem.client.WorkItemOperation.run(WorkItemOperation.java:242) 在 com.ibm.team.workitem.client.WorkItemOperation.run(WorkItemOperation.java:189) 在com.rtc.vda.rtculities.createWorkItem(rtculities.java:191)上 com.rtc.vda.RTCMain.main(RTCMain.java:178)

赋值:odc.impact->Integrity[odc.impact.literal.l4]

这是用于设置枚举值的代码段:

public boolean setAttributeValueEx (IWorkItem w, String attributeKey, String valueName) {

    // (REO) Get the attribute
    IAttribute a = customAttributesMap.get(attributeKey);

    // (REO) Buffer of valid values for error reporting
    StringBuffer b = new StringBuffer();

    try {
        // (REO) Get the enumeration for this attribute from the repository (DO NOT CACHE IT OR YOU WILL HAVE PROBLEMS)
        IWorkItemClient workItemClient = (IWorkItemClient) rtcParameters.getTeamRepository().getClientLibrary(IWorkItemClient.class);
        IEnumeration<? extends ILiteral> rtcAttrEnumeration = workItemClient.resolveEnumeration(a, curMonitor);

        // (REO) Find an enum value that matches this string and assign it
        for (ILiteral literal : rtcAttrEnumeration.getEnumerationLiterals()) {
            String vName = literal.getName();
            String vId = literal.getIdentifier2().getStringIdentifier();
            b.append(",");
            b.append(vName);
            if (valueName.equalsIgnoreCase(vName)) {
                String msg2 = "Assigning: " + a.getIdentifier() + " -> " + vName + " [" + vId + "]";
                RTCMain.out(msg2);
                w.setValue(a, literal.getIdentifier2()); // (REO) SOURCE OF PERIODIC EXCEPTION
                return true;
            }
        }
    } catch (Exception e) {
        RTCMain.out("EXCEPTION: Could not assign value, even though it was found in the enumeration list:\n\t[" + b + "]");
        e.printStackTrace();
        RTCMain.out("");
        return false;
    }

    RTCMain.out("VALUE NOT FOUND: Valid values are:" + b);
    return false;
}
public boolean setAttributeValuex(IWorkItem w,String attributeKey,String valueName){
//(REO)获取属性
IAttribute a=CustomAttributeMap.get(attributeKey);
//(REO)用于错误报告的有效值缓冲区
StringBuffer b=新的StringBuffer();
试一试{
//(REO)从存储库中获取此属性的枚举(不要缓存它,否则会出现问题)
IWorkItemClient workItemClient=(IWorkItemClient)rtcParameters.getTeamRepository().getClientLibrary(IWorkItemClient.class);

IEnumeration您只需要使用传递给execute()调用的workingCopy.getWorkItem()对象,而不是成员变量中的缓存版本。workingCopy对象上的属性不是不变的,可以正常工作

public class WorkItemCreator extends WorkItemOperation {

...

    @Override
    protected void execute(WorkItemWorkingCopy workingCopy, IProgressMonitor monitor) throws TeamRepositoryException {

        IWorkItem newWorkItem = workingCopy.getWorkItem();
        // Set attribute values on newWorkItem to avoid ImmutablePropertyExceptions