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

  1. Confirm the selected template's template_content is non-empty in sys_sms_template.
  2. Ensure message.getData() supplies every placeholder referenced by the template.
  3. If sending without a template, set message.setContent(...) explicitly before sendMessage.
  4. 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

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


AI-assisted analysis of jeecgboot/JeecgBoot@96fb33f5ec (2026-08-14). Data as JSON: /api/errors/bc137b9cfed7574a. Report an issue: GitHub.