Action code can't be null or empty string

本文介绍了在XML配置文件中为按钮添加code属性的重要性。由于缺少该属性导致系统报错,文章通过具体示例展示了如何正确配置按钮并解决此问题。

报错原因是因为 在xml配置按钮的时候 没有给code属性

<!-- 订单列表 插入下载WMS按钮-->
    <bean class="nc.ui.pubapp.plugin.action.InsertActionInfo">
        <property name="actionContainer" ref="actionsOfList" />
        <property name="actionType" value="notedit" />
        <property name="target" ref="printActionGroup" />
        <property name="pos" value="after" />
        <property name="action" ref="DeliveryAction" />
    </bean>


    <!-- 自定义 按钮 -->
    <bean id="DeliveryAction" class="nc.ui.sf.delivery.action.DeliveryAction">      
        <property name="model" ref="ManageAppModel" />
        <property name="editor" ref="billFormEditor" />
        <property name="code" value="delivery_wms" />   
    </bean> 
internal class ELS_rqst_Info { public string msgId { get; set; } = string.Empty; public string eqpId { get; set; } = string.Empty; public string subEqpId { get; set; } = string.Empty; public string secondSubEqpId { get; set; } = string.Empty; public string carrierId { get; set; } = string.Empty; public string eapUserId { get; set; } = string.Empty; public string fabId { get; set; } = string.Empty; public string portId { get; set; } = string.Empty; public string clampTime { get; set; } = string.Empty; public string carrierArriveTime { get; set; } = string.Empty; public string loadStartTime { get; set; } = string.Empty; public string loadCompleteTime { get; set; } = string.Empty; public string unloadCompleteTime { get; set; } = string.Empty; public string carrierRemoveTime { get; set; } = string.Empty; public List<ELS_rqst_Slot_info> slotListInfo { get; set; } public List<ELS_rqst_APCParm_info> apcParmListInfo { get; set; } private Dictionary<string, Func<object, object>> dicxmlnodes { get; set; } public ELS_rqst_Info() { slotListInfo = new List<ELS_rqst_Slot_info>(); apcParmListInfo = new List<ELS_rqst_APCParm_info>(); dicxmlnodes = new Dictionary<string, Func<object, object>>(); InitXmlNodeList(); } private void InitXmlNodeList() { dicxmlnodes.Add("msgId", (val) => { msgId = (val as string ?? ""); return msgId; }); dicxmlnodes.Add("eqpId", (val) => { eqpId = (val as string ?? ""); return eqpId; }); dicxmlnodes.Add("subEqpId", (val) => { subEqpId = (val as string ?? ""); return subEqpId; }); dicxmlnodes.Add("secondSubEqpId", (val) => { secondSubEqpId = (val as string ?? ""); return secondSubEqpId; }); dicxmlnodes.Add("carrierId", (val) => { carrierId = (val as string ?? ""); return carrierId; }); dicxmlnodes.Add("eapUserId", (val) => { eapUserId = (val as string ?? ""); return eapUserId; }); dicxmlnodes.Add("fabId", (val) => { fabId = (val as string ?? ""); return fabId; }); dicxmlnodes.Add("portId", (val) => { portId = (val as string ?? ""); return portId; }); dicxmlnodes.Add("carrierArriveTime", (val) => { carrierArriveTime = (val as string ?? ""); return clampTime; }); dicxmlnodes.Add("clampTime", (val) => { clampTime = (val as string ?? ""); return clampTime; }); dicxmlnodes.Add("loadStartTime", (val) => { loadStartTime = (val as string ?? ""); return loadStartTime; }); dicxmlnodes.Add("loadCompleteTime", (val) => { loadCompleteTime = (val as string ?? ""); return loadCompleteTime; }); dicxmlnodes.Add("unloadCompleteTime", (val) => { unloadCompleteTime = (val as string ?? ""); return unloadCompleteTime; }); dicxmlnodes.Add("carrierRemoveTime", (val) => { carrierRemoveTime = (val as string ?? ""); return carrierRemoveTime; }); dicxmlnodes.Add("slotInfo", (val) => new ELS_rqst_Slot_info()); dicxmlnodes.Add("apcParmInfo", (val) => new ELS_rqst_APCParm_info()); } internal object GetObjList(object elementObj) { if (elementObj is ELS_rqst_Slot_info) { return slotListInfo; } else if (elementObj is ELS_rqst_APCParm_info) { return apcParmListInfo; } else { return elementObj; } } public (bool, string) ObjFromXml(XElement root) { bool retCode = true; StringBuilder errSb = new StringBuilder(); try { var msgBodyNode = root.Element(SRVConstants.STR_XMLNODE_MSGBODY); foreach (var currElem in dicxmlnodes.Keys) { var currNode = msgBodyNode!.Element(currElem); if (currNode == null) { string errMissingDesc = $"sub-node msg/msgBody/{currElem} not found node! \n"; errSb.Append(errMissingDesc); retCode = false; } else { var nodeStrValue = msgBodyNode!.Element(currElem)!.Value.ToString(); var nodeobj = dicxmlnodes[currElem](nodeStrValue); if (nodeobj is IObjFromXml) { //Verify lotinfo, slotinfo, recipeinfo, apcParmInfo var result = (nodeobj as IObjFromXml)!.ObjFromXml(root, currElem, errSb, GetObjList(nodeobj)); if (result.Item1 == false) { errSb.Append(result.Item2); retCode = false; } } } } } catch (Exception e) { Log.logger.Error(e.StackTrace); return (false, e.Message); } return (retCode, errSb.ToString()); } public (bool, string) ObjFromXml(string xmlstr) { try { var root = XElement.Parse(xmlstr); return ObjFromXml(root); } catch (Exception e) { Log.logger.Error(e.StackTrace); return (false, e.Message); } } } internal class ELS_rqst_Slot_info : IObjFromXml { public string lotId { get; set; } = string.Empty; public string waferId { get; set; } = string.Empty; public string slotId { get; set; } = string.Empty; public string componentId { get; set; } = string.Empty; public string waferSelection { get; set; } = string.Empty; private Dictionary<string, Action<string>> dicxmlnodes { get; set; } public ELS_rqst_Slot_info() { dicxmlnodes = new Dictionary<string, Action<string>>(); InitXmlNodeList(); } private void InitXmlNodeList() { dicxmlnodes.Add("lotId", (val) => lotId = val ?? ""); dicxmlnodes.Add("waferId", (val) => waferId = val ?? ""); dicxmlnodes.Add("slotId", (val) => slotId = val ?? ""); dicxmlnodes.Add("componentId", (val) => componentId = val ?? ""); dicxmlnodes.Add("waferSelection", (val) => waferSelection = val ?? ""); } public (bool, string) ObjFromXml(XElement root, string NodeName, StringBuilder sb, object objlist) { bool retCode = true; try { var slotInfoNodes = root.Element(SRVConstants.STR_XMLNODE_MSGBODY)!.Elements(NodeName); if (slotInfoNodes == null) return (false, "/msg/msgBody/slotinfo node is empty \n"); string errNodeName = ""; string errMissingDesc = $"sub-Node {errNodeName} not found in /msg/msgBody/slotinfo \n"; var slotinfolist = objlist as List<ELS_rqst_Slot_info>; foreach (var slotNode in slotInfoNodes) { var newSlot = new ELS_rqst_Slot_info(); foreach (var currElem in newSlot.dicxmlnodes.Keys) { if (slotNode.Element(currElem) == null) { errNodeName = currElem; sb.Append(errMissingDesc); retCode = false; } else { var nodeStrValue = slotNode!.Element(currElem)!.Value.ToString(); newSlot.dicxmlnodes[currElem](nodeStrValue); } } slotinfolist?.Add(newSlot); } } catch (Exception e) { Log.logger.Error(e.StackTrace); return (false, e.Message); } return (retCode, sb.ToString()); } } internal class ELS_rqst_APCParm_info : IObjFromXml { public string subEqpId { get; set; } = string.Empty; public string lotId { get; set; } = string.Empty; public List<ELS_APCParmInfo> apcParmlist; private Dictionary<string, Func<object, object>> dicxmlnodes { get; set; } public ELS_rqst_APCParm_info() { dicxmlnodes = new Dictionary<string, Func<object, object>>(); apcParmlist = new List<ELS_APCParmInfo>(); InitXmlNodeList(); } private void InitXmlNodeList() { dicxmlnodes.Add("subEqpId", (val) => { subEqpId = val as string ?? ""; return subEqpId; }); dicxmlnodes.Add("lotId", (val) => { lotId = val as string ?? ""; return lotId; }); dicxmlnodes.Add("parmInfo", (val) => new ELS_APCParmInfo()); } public (bool, string) ObjFromXml(XElement RootNode, string NodeName, StringBuilder sb, object objlist) { bool retCode = true; try { var apcNodes = RootNode.Element(SRVConstants.STR_XMLNODE_MSGBODY)!.Elements(NodeName); if (apcNodes == null) return (false, "/msg/msgNody/apcParmInfo node is empty (must at least to be an empty node) \n"); var apcinfolist = objlist as List<ELS_rqst_APCParm_info>; foreach (var parmNode in apcNodes) { if (parmNode.HasElements == false) { //allow empty node continue; } ELS_rqst_APCParm_info newNode = new ELS_rqst_APCParm_info(); foreach (var currElem in dicxmlnodes.Keys) { if (parmNode.Element(currElem) == null) { string errMissingDesc = $"sub-Node {currElem} not found in /msg/msgBody/apcParmInfo when node is not empty\n"; sb.Append(errMissingDesc); retCode = false; } else { var nodeStrValue = parmNode!.Element(currElem)!.Value.ToString(); var nodeobj = newNode.dicxmlnodes[currElem](nodeStrValue); if (nodeobj is IObjFromXml) { var newobj = nodeobj as ELS_APCParmInfo; var res = newobj!.ObjFromXml(parmNode, currElem, sb, newNode.apcParmlist); if (res.Item1 == false) { retCode = false; return (retCode, res.Item2); } } } } apcinfolist!.Add(newNode); } } catch (Exception e) { Log.logger.Error(e.StackTrace); return (false, e.Message); } return (retCode, sb.ToString()); } } internal class ELS_APCParmInfo : IObjFromXml { public string paraName { get; set; } = string.Empty; public string paraValue { get; set; } = string.Empty; private Dictionary<string, Action<string>> dicxmlnodes { get; set; } public ELS_APCParmInfo() { dicxmlnodes = new Dictionary<string, Action<string>>(); InitXmlNodeList(); } private void InitXmlNodeList() { dicxmlnodes.Add("parmName", (val) => paraName = val ?? ""); dicxmlnodes.Add("parmValue", (val) => paraValue = val ?? ""); } public (bool, string) ObjFromXml(XElement RootNode, string NodeName, StringBuilder sb, object objlist) { bool retCode = true; try { var parmNodes = RootNode.Elements(NodeName); if (parmNodes == null) return (false, "/msg/msgNody/apcParmInfo node is empty (must at least to be an empty node) \n"); var parmInfolist = objlist as List<ELS_APCParmInfo>; foreach (var Node in parmNodes) { ELS_APCParmInfo newNode = new ELS_APCParmInfo(); foreach (var currElem in dicxmlnodes.Keys) { if (Node.Element(currElem) == null) { string errMissingDesc = $"sub-Node {currElem} not found in /msg/msgBody/apcParmInfo when node is not empty\n"; sb.Append(errMissingDesc); retCode = false; } else { var nodeStrValue = Node!.Element(currElem)!.Value.ToString(); newNode.dicxmlnodes[currElem](nodeStrValue); } } parmInfolist!.Add(newNode); } } catch (Exception e) { Log.logger.Error(e.StackTrace); return (false, e.Message); } return (retCode, sb.ToString()); } } 以上代码组成的消息是
08-09
现在遇到一个缩略图不显示的问题(显示为灰色)。有如下打印。 11-26 10:23:50.037832 593 9107 E MediaProviderClient: Ensure providers failed 11-26 10:23:50.326948 6301 7518 W MediaProvider: android.graphics.ImageDecoder$DecodeException: Input was incomplete. 11-26 10:23:52.289577 1765 9848 W MediaCodecList: Codec does not support profile 2 11-26 10:23:52.289671 1765 9848 V MediaCodecList: skipping codec 'c2.mtk.hevc.decoder' which doesn't satisfy format AMessage(what = 0x00000000) = { string mime = "video/hevc" int64_t durationUs = 7615807000 string language = "und" int32_t width = 1920 int32_t height = 800 int32_t display-width = 1920 int32_t display-height = 800 Buffer *csd-0 = 0xb400007b68edb880 int32_t android._is-hdr = 0 int32_t color-standard = 1 int32_t color-transfer = 3 int32_t color-range = 2 int32_t profile = 2 int32_t level = 1024 } 11-26 10:23:52.289831 1765 9848 V MediaCodecList: skipping codec 'c2.android.hevc.decoder' which doesn't satisfy format AMessage(what = 0x00000000) = { string mime = "video/hevc" int64_t durationUs = 7615807000 string language = "und" int32_t width = 1920 int32_t height = 800 int32_t display-width = 1920 int32_t display-height = 800 Buffer *csd-0 = 0xb400007b68edb880 int32_t android._is-hdr = 0 int32_t color-standard = 1 int32_t color-transfer = 3 int32_t color-range = 2 int32_t profile = 2 int32_t level = 1024 } 11-26 10:23:52.290712 1765 9848 D MediaCodec: CreateByComponentName: name c2.mtk.hevc.decoder 11-26 10:23:52.344165 1765 9129 D OplusCCodec: not enable high quality 11-26 10:23:52.344700 1765 9129 W AString : ctor got NULL, using empty string instead 11-26 10:23:52.344818 1765 9129 W libc : Access denied finding property "vendor.oplus.media.vpp.stutter" 11-26 10:23:52.358878 1765 9130 E mediaserver: Failed to query component interface for required system resources: 6 11-26 10:23:52.419121 1765 9129 E MediaCodec: Codec reported err 0x80000000/UNKNOWN_ERROR, actionCode 0, while in state 6/STARTED 11-26 10:23:52.419241 1765 9142 E FrameDecoder: Codec reported error(0x80000000/UNKNOWN_ERROR), actionCode(0), detail()
最新发布
12-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值