简短版本:如何在Play Framework中的Action中注入一个对象?
长版本:在我的项目中,我有自定义注释操作@AuthenticationRequired
,它从数据库加载User
对象并将其放入context.args
。它使用实现UserDAO
的DAO类。现在我想使用Google Guice注入Action
的DAO类。我可以使用Guice并在控制器和测试中注入实例,但是我很难在Action中注入DAO类。
Injector是GlobalSettings
实例上的字段。
我尝试覆盖GlobalSettings#onRequest()
并将UserDAO实例放到context.args
,然后从AuthenticationRequired
内部检索它,但事实证明GlobalSettings#onRequest()
返回的操作被调用最后在与@With和/或自定义注释一起使用的动作链中,所以,它是迟到的。
我还尝试通过注释动作构造函数来注入DAO实例,但它使用no-args构造函数来创建动作实例。
任何想法我怎样才能做到这一点?
答案 0 :(得分:2)
对于play 2.5,你可以简单地在Action类的构造函数之上添加@Inject并注入所需的东西。这是我工作项目的一个片段(我使用Guice作为DI):
public class ChannelPermissionAction extends Action<ChannelPermission> {
private final AuthorizationService authorizationService;
private final AsyncHelper asyncHelper;
@Inject
public ChannelPermissionAction(AuthorizationService authorizationService, AsyncHelper asyncHelper) {
this.authorizationService = authorizationService;
this.asyncHelper = asyncHelper;
}
...
}
答案 1 :(得分:0)
你可以像控制器一样实现这一点 - 将你的行为描述为(在我的情况下是一个bean - 我正在使用spring IoC)一个依赖项并通过
调用它public <A> A getControllerInstance(Class<A> clazz)
Application Global object的。这就是你所需要的 - 你的依赖关系会被注入。 BTW。需要使用每个实例创建操作,因此在我的情况下,我应该使用“prototype”范围。 在使用Guice时注意它 - 它应该具有类似的功能。