{"record":{"id":"e90a5bf73c32168a","repo":"jeecgboot/JeecgBoot","slug":"error-e90a5b","errorCode":null,"errorMessage":"被发送人不能为空","messagePattern":"被发送人不能为空","errorType":"validation","errorClass":"JeecgBootException","httpStatus":null,"severity":"warning","filePath":"jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java","lineNumber":58,"sourceCode":"    @Resource\n    private SysUserMapper userMapper;\n\n    @Resource\n    private SysAnnouncementSendMapper sysAnnouncementSendMapper;\n\n    @Resource\n    private WebSocket webSocket;\n\n    /**\n     * 该方法会发送3种消息：系统消息、企业微信 钉钉\n     * @param esReceiver 发送人\n     * @param esTitle 标题\n     * @param esContent 内容\n     */\n    @Override\n    public void sendMsg(String esReceiver, String esTitle, String esContent) {\n        if(oConvertUtils.isEmpty(esReceiver)){\n            throw  new JeecgBootException(\"被发送人不能为空\");\n        }\n        ISysBaseAPI sysBaseApi = SpringContextUtils.getBean(ISysBaseAPI.class);\n        MessageDTO messageDTO = new MessageDTO(FROM_USER,esReceiver,esTitle,esContent);\n        sysBaseApi.sendSysAnnouncement(messageDTO);\n    }\n\n    /**\n     * 仅发送系统消息\n     * @param messageDTO\n     */\n    @Override\n    public void sendMessage(MessageDTO messageDTO) {\n        //原方法不支持 sysBaseApi.sendSysAnnouncement(messageDTO);  有企业微信消息逻辑，\n        String title = messageDTO.getTitle();\n        String content = messageDTO.getContent();\n        String fromUser = messageDTO.getFromUser();\n        Map<String,Object> data = messageDTO.getData();\n        String[] arr = messageDTO.getToUser().split(\",\");","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/jeecgboot/JeecgBoot/blob/96fb33f5ec68516da0b0147da06b2eb0419e063a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java#L40-L76","documentation":"SystemSendMsgHandle.sendMsg() sends a system announcement and requires a non-empty recipient (esReceiver -- a username). It throws JeecgBootException '被发送人不能为空' immediately when esReceiver is blank, before delegating to sysBaseApi.sendSysAnnouncement.","triggerScenarios":"A message template / schedule triggers with no configured recipient; the esReceiver argument is null/empty/whitespace; the referenced user was deleted upstream so the caller passed empty.","commonSituations":"Message config missing the receiver field; a workflow/notification node with an empty recipient expression; a dict-driven recipient that resolved to empty.","solutions":["Configure a recipient (username) on the triggering message template/schedule.","Validate esReceiver is non-empty at the caller before invoking sendMsg.","If recipients are computed, fall back to a default admin user instead of empty."],"exampleFix":"// before\npublic void sendMsg(String esReceiver, String esTitle, String esContent) {\n    if(oConvertUtils.isEmpty(esReceiver)){ throw new JeecgBootException(\"被发送人不能为空\"); }\n    ...\n}\n// after - caller-side guard\nif (oConvertUtils.isEmpty(receiver)) { log.warn(\"跳过发送：无收件人\"); return; }","handlingStrategy":"validation","validationCode":"if (oConvertUtils.isEmpty(esReceiver)) {\n    log.warn(\"系统消息发送被跳过：收件人为空, title={}\", esTitle);\n    return; // or throw, depending on caller policy\n}","typeGuard":null,"tryCatchPattern":"try {\n    systemSendMsgHandle.sendMsg(receiver, title, content);\n} catch (JeecgBootException e) {\n    if (\"被发送人不能为空\".equals(e.getMessage())) {\n        log.warn(\"跳过发送：无收件人\");\n    } else throw e;\n}","preventionTips":["Configure recipients on all message templates/schedules.","Resolve recipient expressions to a non-empty value or skip the send."],"tags":["message","notification","validation","system"],"backgroundTag":null,"analyzedSha":"96fb33f5ec68516da0b0147da06b2eb0419e063a","analyzedAt":"2026-08-14T00:04:16.786Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}