jeecgboot/JeecgBoot · error · JeecgBootException
发送消息失败,消息内容为空!
Error message
发送消息失败,消息内容为空!
What it means
After template selection, Freemarker parsing, and content assembly, sendMessage aborts if message.getContent() is still empty. This prevents blank notifications and surfaces misconfiguration: either no template was chosen and no raw content set, or the chosen template's content is empty / produced nothing after parsing.
Source
Thrown at jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java:1727
@Override
public void sendTemplateMessage(MessageDTO message) {
String messageType = message.getType();
log.debug(" 【万能通用】推送消息 messageType = {}", messageType);
// 代码逻辑说明: 将模板解析代码移至消息发送, 而不是调用的地方
String templateCode = message.getTemplateCode();
if(oConvertUtils.isNotEmpty(templateCode)){
SysMessageTemplate templateEntity = getTemplateEntity(templateCode);
boolean isMarkdown = CommonConstant.MSG_TEMPLATE_TYPE_MD.equals(templateEntity.getTemplateType());
String content = templateEntity.getTemplateContent();
if(oConvertUtils.isNotEmpty(content) && null!=message.getData()){
content = FreemarkerParseFactory.parseTemplateContent(content, message.getData(), isMarkdown);
}
message.setIsMarkdown(isMarkdown);
message.setContent(content);
}
if(oConvertUtils.isEmpty(message.getContent())){
log.error("发送消息失败,消息内容为空!");
throw new JeecgBootException("发送消息失败,消息内容为空!");
}
if(MessageTypeEnum.XT.getType().equals(messageType)){
if (message.isMarkdown()) {
// 系统消息要解析Markdown
message.setContent(HTMLUtils.parseMarkdown(message.getContent()));
}
systemSendMsgHandle.sendMessage(message);
}else if(MessageTypeEnum.YJ.getType().equals(messageType)){
if (message.isMarkdown()) {
// 邮件消息要解析Markdown
message.setContent(HTMLUtils.parseMarkdown(message.getContent()));
}
// 代码逻辑说明: 【QQYUN-8523】敲敲云发邮件通知,不稳定---
if(message.getIsTimeJob() != null && message.getIsTimeJob()){
emailSendMsgHandle.sendEmailMessage(message);
}else{
emailSendMsgHandle.sendMessage(message);View on GitHub (pinned to 96fb33f5ec)
Solutions
- Confirm the selected template's template_content is non-empty in sys_sms_template.
- Ensure message.getData() supplies every placeholder referenced by the template.
- If sending without a template, set message.setContent(...) explicitly before sendMessage.
- Log the templateCode and rendered content length to pinpoint the empty source.
Example fix
// before
Message m = ...; // template chosen but content blank
sysBaseApi.sendMessage(m); // -> 发送消息失败,消息内容为空!
// after
if (oConvertUtils.isEmpty(m.getContent())) {
log.warn("消息内容为空, templateCode={}, data={}", m.getTemplateCode(), m.getData());
return; // skip send, or set a default body
}
sysBaseApi.sendMessage(m); Defensive patterns
Strategy: validation
Validate before calling
// Ensure content is non-empty before sending.
if (oConvertUtils.isEmpty(message.getContent())) {
log.warn("消息内容为空, templateCode={}, data={}", message.getTemplateCode(), message.getData());
return; // skip send
} Type guard
public boolean hasSendableContent(MessageDTO m) {
return oConvertUtils.isNotEmpty(m.getContent());
} Try / catch
try {
sysBaseApi.sendMessage(message);
} catch (JeecgBootException e) {
if ("发送消息失败,消息内容为空!".equals(e.getMessage())) {
log.error("消息发送中止: 内容为空, templateCode={}", message.getTemplateCode());
return; // don't propagate blank-message errors to the user flow
}
throw e;
} Prevention
- Validate template_content is non-empty when creating templates in the UI.
- Ensure data DTOs supply every placeholder referenced by the template.
- Log templateCode and rendered length to diagnose empty renders.
When it happens
Trigger: templateCode set but template.template_content is blank; Freemarker produced an empty string because required placeholders had null values; no templateCode and message content never assigned; message.getData() is null where the template references ${} keys.
Common situations: Template row exists but its content column is empty; the data DTO carries null fields referenced by placeholders; messageType path was set but content population was skipped.
Related errors
- DaoFormat 是 minidao 保留关键字,不允许使用 ,请更改参数定义!
- 解析SQL模板异常
- 被发送人不能为空
- 消息模板不存在,模板编码:${templateCode}
- 模板缺少参数:${item}
AI-assisted analysis of jeecgboot/JeecgBoot@96fb33f5ec (2026-08-14).
Data as JSON: /api/errors/bc137b9cfed7574a.
Report an issue: GitHub.