升级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
相关产品推荐
相关产品推荐

