kd.bos.exception.KDException: ***** 操作未定义实现类!原创
金蝶云社区-cosmicstudio
cosmicstudio
10人赞赏了该文章 3,941次浏览 未经作者许可,禁止转载编辑于2022年04月01日 14:34:48

如何解决:

断点kd.bos.form.FormMetadataProvide.getFormOperation(String entityId, String operationKey)

在单据entityId里面添加报错操作就可以了


------------------------------------------------------------------------------------------------------------------------

操作未定义实现类,同时*****缺显示操作的key,而不是type

image.png


出现场景: 定义一个key=modifysubject;type=donothing 的操作,点击操作按钮报错,操作未定义实现类;


正常逻辑: type=donothing 的操作为平台内置类型是有实现类,而报错确提示modifysubject(key)未定义实现类;

通过调试代码发现,当找不到操作类型type时,就会把key设为type;

操作类型是通过查询页面元实体表(T_META_ENTITY)获得的,如果查询不到可推断此页面并没有添加此操作;这里可能有点疑惑没添加你是如何使用的:例如你重写单据列表-表单模板,在新的表单模板添加了的操作,而在原单据-页面列表并没有添加相同的操作时;其实元实体查询的FNUMBER参数的值为原单据标识,所以查询不到

SELECT FDATA from T_META_ENTITY where FNUMBER = 'dmp_require_manage_org' and FKEY = 'addsubsubject'
and FTYPE = 13


关键代码:

kd.bos.form.FormMetadataProvide

public FormOperate getFormOperation(String entityId, String operationKey) {
    String operateStr = this.metadataService.loadEntityOperationMeta(entityId, operationKey);
    Object op;
    if (!StringUtils.isEmpty(operateStr)) {
        op = (Map)SerializationUtils.fromJsonString(operateStr, Map.class);
    } else {
        op = new HashMap(16);
        ((Map)op).put("type", operationKey.toLowerCase());
        ((Map)op).put("key", operationKey.toLowerCase());
        Map<String, Object> name = new HashMap(16);
        name.put(Locale.getDefault().toString(), operationKey.toLowerCase());
        ((Map)op).put("name", name);
    }

    FormOperate operate = (FormOperate)FormOperateTypes.createFormOperate((Map)op);
    return operate;
}


赞 10