You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Play Framework定时任务调用无HTTP Context,无法用Messages实现邮件翻译

解决Play Framework定时任务中使用Messages的HTTP Context缺失问题

这个问题我之前也碰到过!核心原因就是Play的Messages默认依赖HTTP请求上下文——它需要从当前请求里获取语言环境、消息源这些信息,但定时任务是后台异步运行的,根本没有HTTP请求,自然就找不到Context了。别担心,有两种靠谱的解决思路:

1. 直接注入MessagesApi,手动指定语言环境

Messages本质上是MessagesApi的封装,后者不需要依赖HTTP Context。我们可以直接在定时任务类里注入MessagesApi,然后手动传入目标语言来获取翻译文本。

Java示例:

import play.i18n.MessagesApi;
import play.i18n.Lang;
import javax.inject.Inject;

public class HourlyNotificationTask {
    private final MessagesApi messagesApi;

    // 通过构造函数注入MessagesApi(Play的依赖注入机制)
    @Inject
    public HourlyNotificationTask(MessagesApi messagesApi) {
        this.messagesApi = messagesApi;
    }

    public void execute() {
        // 1. 确定目标语言:可以硬编码(比如"zh-CN"),也可以从用户设置/数据库读取
        Lang targetLang = Lang.forCode("zh-CN");
        
        // 2. 用MessagesApi获取翻译后的文本,替代原有的Messages.get()
        String notificationTitle = messagesApi.get(targetLang, "notification.title");
        String notificationContent = messagesApi.get(targetLang, "notification.content", "参数1", "参数2");
        
        // 3. 将文本传入邮件模板,发送邮件
        sendEmail(notificationTitle, notificationContent);
    }
}

Scala示例:

import play.api.i18n.{MessagesApi, Lang}
import javax.inject.Inject

class HourlyNotificationTask @Inject()(messagesApi: MessagesApi) {
  def execute(): Unit = {
    val targetLang = Lang("zh-CN")
    val notificationTitle = messagesApi("notification.title")(targetLang)
    val notificationContent = messagesApi("notification.content", "参数1", "参数2")(targetLang)
    
    sendEmail(notificationTitle, notificationContent)
  }
}

2. 渲染邮件模板时传递Messages实例

如果你的邮件模板原本依赖@Messages()模板标签,那可以手动创建Messages实例并传递给模板,避免模板直接依赖HTTP Context。

步骤1:修改模板,接收Messages参数

比如原模板views.html.emails.notification.scala.html改成:

@(messages: play.api.i18n.Messages)
<div class="email-content">
  <h1>@messages("notification.title")</h1>
  <p>@messages("notification.content")</p>
</div>

步骤2:在定时任务中创建Messages并渲染模板

// 在定时任务的execute方法里
val targetLang = Lang("zh-CN")
// 用MessagesApi创建Messages实例
val messages = messagesApi.preferred(Seq(targetLang))
// 渲染模板时传入messages
val emailHtml = views.html.emails.notification.render(messages)
// 发送HTML邮件
sendHtmlEmail(emailHtml)

额外提示

如果你的系统支持多语言,建议不要硬编码语言代码——可以从用户的个人设置(比如数据库存储的lang字段)中读取对应语言,再创建Lang对象,这样能做到用户专属的本地化通知。

内容的提问来源于stack exchange,提问作者MÖRK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:07:46