技术求助:无法从Documentum的CmisObject获取自定义属性
解决Documentum CMIS无法获取自定义属性的问题
首先,我注意到你代码里的一个明显问题——在遍历属性迭代器的时候,每次循环调用了两次propertie.next(),这会导致迭代器每次移动两步,跳过一半的属性,甚至可能抛出NoSuchElementException。先把这个问题修复:
Document sourceDocument = (Document) getCmisObject(sourceSession, sourceObjectId); Iterator<Property<?>> properties = sourceDocument.getProperties().iterator(); while(properties.hasNext()){ Property<?> prop = properties.next(); // 只调用一次next(),存到变量里 System.out.println("Display Name:" + prop.getDisplayName()); // 注意空值判断,避免NullPointerException System.out.println("Value:" + (prop.getValue() != null ? prop.getValue().toString() : "null")); }
接下来解决自定义属性无法获取的核心问题,这通常是因为CMIS默认只会加载对象的核心属性,不会自动包含自定义扩展属性,你需要显式配置获取策略:
方法1:获取对象时指定加载所有属性
在调用getObject时,通过OperationContext设置includeAllProperties为true,或者直接指定filter为*(表示加载所有属性):
// 创建自定义操作上下文 OperationContext opContext = sourceSession.createOperationContext(); opContext.setIncludeAllProperties(true); opContext.setFilter("*"); // 显式指定加载所有属性,也可以列出具体自定义属性ID,比如"my:customProp1,my:customProp2" // 使用该上下文获取对象 Document sourceDocument = (Document) sourceSession.getObject(sourceObjectId, opContext);
这样获取到的对象就会包含所有属性,包括Documentum的自定义属性。
方法2:通过对象类型定义遍历所有属性
如果自定义属性属于特定的对象类型,你可以先获取对象的类型定义,再遍历所有属性定义来提取对应的值:
Document sourceDocument = (Document) getCmisObject(sourceSession, sourceObjectId); ObjectType objectType = sourceDocument.getType(); // 获取该类型的所有属性定义 List<PropertyDefinition<?>> propDefs = objectType.getPropertyDefinitions(); for(PropertyDefinition<?> propDef : propDefs){ String propId = propDef.getId(); Property<?> prop = sourceDocument.getProperty(propId); if(prop != null){ System.out.println("Display Name:" + prop.getDisplayName()); System.out.println("Value:" + (prop.getValue() != null ? prop.getValue().toString() : "null")); } }
额外注意点
- Documentum的自定义属性通常带有命名空间前缀(比如你自定义的
my:或者项目特定前缀),确保在filter里包含这些前缀的属性ID,或者直接用*匹配所有。 - 如果你使用的是CMISHelper工具类,检查它的
objectProperties方法是否默认只返回核心属性,可能需要修改该方法的实现,添加类似上面的属性加载逻辑。
内容的提问来源于stack exchange,提问作者Kalebere Gaurav
相关产品推荐
相关产品推荐

