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

升级Play 2.5.12至2.5.18时使用MessagesApi触发ExceptionInInitializerError

解决Play 2.5.x升级中MessagesApi的运行错误问题

我来帮你搞定这个Play框架升级时遇到的MessagesApi问题~从Play 2.4开始,旧的Message类就被弃用,官方推荐用MessagesApi来处理国际化,不过Java和Scala的用法确实有差异,我给你梳理下Java环境下的正确配置和使用步骤:

1. 正确注入MessagesApi(控制器中)

首先要确保MessagesApi是通过构造函数注入的,这是Play 2.5之后推荐的依赖注入方式,不要自己手动实例化:

import play.i18n.MessagesApi;
import play.mvc.Controller;
import javax.inject.Inject;

public class Application extends Controller {
    private final MessagesApi messagesApi;

    // 用@Inject标记构造函数,让Play的DI容器自动注入MessagesApi实例
    @Inject
    public Application(MessagesApi messagesApi) {
        this.messagesApi = messagesApi;
    }
}

2. 在Action中获取Messages上下文

MessagesApi本身不能直接在视图里用,需要结合当前请求的语言偏好生成Messages对象,再传递给视图:

public Result home() {
    // 根据请求头里的语言偏好生成Messages实例
    Messages messages = messagesApi.preferred(request());
    // 把Messages传递给视图模板
    return ok(views.html.home.render(messages));
}

3. 视图模板中使用Messages

在对应的HTML模板(比如home.scala.html)里,需要接收Messages参数,然后调用它的方法获取国际化文案:

@(messages: play.i18n.Messages)

<div class="welcome">
    <h1>@messages("app.welcome")</h1>
    <p>@messages("app.description", "Play 2.5")</p>
</div>

4. 检查国际化配置

确认conf/application.conf里的国际化配置正确,比如:

# 支持的语言列表
play.i18n.langs = [ "en", "zh-CN" ]

同时conf目录下要有对应的国际化文件,比如messages(默认英文)、messages.zh-CN(中文),文件里是键值对形式的文案:

app.welcome = "Welcome to our App!"
app.description = "This is a %s application."

常见错误排查

如果还是报错,你可以检查这几点:

  • 有没有忘记给构造函数加@Inject注解?如果没加,Play的DI容器不会注入MessagesApi,运行时会出现空指针或者注入失败的错误。
  • 是不是在非控制器类里使用MessagesApi?比如服务类里,同样需要通过构造函数注入,不能用静态方式获取。
  • 有没有确保请求对象request()是有效的?在某些异步场景下,要注意请求上下文的传递,避免request()返回null。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:17:51