Play 2.4.x注入MessagesApi启动报错:No qualifying bean found for `MessagesApi`
这问题我之前在Play 2.4的项目里也碰到过,大概率是依赖注入的配置或者类的管理方式出了问题,给你几个排查和解决的方向:
检查Guice注入是否启用
Play 2.4默认使用Guice作为依赖注入容器,但有时候项目配置可能没开启它。打开conf/application.conf,确认有没有这行配置:play.modules.enabled += "play.api.inject.guice.GuiceModule"如果没有,添加进去,这是让Play加载默认的Guice模块,它会自动绑定
MessagesApi这类核心组件。确保控制器被Guice正确管理
控制器必须是Guice的bean才能被注入,所以要给控制器添加@Inject注解的构造函数,把MessagesApi作为参数传入:
比如Java控制器:import play.api.i18n.MessagesApi; import play.mvc.Controller; import javax.inject.Inject; public class HomeController extends Controller { private final MessagesApi messagesApi; // 用@Inject标记构造函数,让Guice自动注入MessagesApi @Inject public HomeController(MessagesApi messagesApi) { this.messagesApi = messagesApi; } // 你的动作方法示例 public Result index() { String message = messagesApi.get("welcome.message"); return ok(message); } }如果是Scala控制器,写法是这样的:
import play.api.i18n.MessagesApi import play.api.mvc.Controller import javax.inject.Inject class HomeController @Inject()(val messagesApi: MessagesApi) extends Controller { def index = Action { val message = messagesApi("welcome.message") Ok(message) } }注意:不要用无参构造函数或者静态方法,否则Guice找不到要注入的对象。
确认核心依赖已正确引入
MessagesApi属于Play的核心i18n组件,要确保build.sbt里引入了对应的依赖:
Java项目:libraryDependencies ++= Seq( javaCore, javaJdbc, javaWs )Scala项目:
libraryDependencies ++= Seq( core, jdbc, ws )只要包含了
javaCore(Java)或core(Scala),就会包含MessagesApi的相关类。清理并重新构建项目
有时候是编译缓存导致的问题,Guice没扫描到最新的类。运行以下命令清理缓存并重新构建:sbt clean compile run如果用Activator的话:
activator clean compile run检查自定义模块是否干扰了绑定
如果你自己写了Guice自定义模块,检查有没有错误地覆盖或排除了MessagesApi的绑定。Play的默认Guice模块已经帮你绑定了MessagesApi,如果要自定义实现,应该用bind(MessagesApi.class).to(YourCustomMessagesApi.class)的方式,而不是直接移除原有绑定。
内容的提问来源于stack exchange,提问作者tgk

