玩! 2.1-RC2 JavaForms validate()没有静态引用

时间:2013-01-23 03:59:34

标签: java playframework-2.0 playframework-2.1

我一直在玩游戏! 2.1遵循ZenTasks示例设置基本登录系统的示例。我陷入困境的是JavaForms部分。我想使用Guice DI提供的auth服务实例来验证登录请求。

我正在关注Play20 Sample。此示例使用静态authenticate()方法在表单提交后请求表单验证时运行身份验证。关于如何在非静态范围内执行此验证步骤的任何想法?

注意:我看过Play!验证插件以及SecureSocial插件,但是这些项目对我现在想做的事情来说太过分了。另外,我感兴趣的是允许在JavaForms中进行非静态验证的一般解决方案。

修改 似乎对我在这里要求的内容存在一些困惑。我希望找到的是另一种方法来执行Play发送的表单提交的验证步骤!框架Form.form()生成的表单。目前,它要求在POJO的实例上调用validate()方法,该方法不是通过DI框架创建的。这导致访问授权服务等需要静态引用...

编辑2: 我正在使用的当前解决方案是:

public static class AuthServiceFormReference {
    @Inject
    public static Provider<AuthService> authService;        
}

// In my auth module configure()
//...
    requestStaticInjection(AuthController.AuthServiceFormReference.class);
//...

public static class Login {
    @Required
    public String email;
    @Required
    public String password;

    public String validate(){
        if(AuthServiceFormReference.authService.get().authenticateAdmin(email, password) == null) {
            return "Invalid user or password";
        }
        return null;
    }
}

这是一个好的解决方法,但它仍然依赖静态注入:(

2 个答案:

答案 0 :(得分:0)

Play Framework不提供开箱即用的Dependency Injection。但是,您可以将它与Guice或Spring集成。作为一个懒惰的开发人员,您还可以为服务创建Singleton,或者将其设置为插件(因为它可能需要准备应用程序启动的工作)。然后,您可以获得对插件的引用 - Play.application().plugin(AuthPlugin.class)

在这种特殊情况下,您可以在验证方法中进行数据库查找,例如

User u = User.find.where().eq("username", username).eq("password`,password).findUnique();
if (u == null)
 return "Error.";
else
 return null;

所以这不是Play Framework,而是Java编程。

答案 1 :(得分:0)

假设您use Spring,您可以像在任何其他Java程序中那样执行此操作:

@Configurable
public class MyModel {
    @Autowired
    transient MyService myService;

    public String validate() { ... }
}

@Configurable注释使该类能够依赖注入。瞬态限定符确保该字段不会被作为一个字段保存到数据库中。

Spring在我的一个项目中使用Play 2.0 / 2.1很好。我不认为模型对象中的依赖注入在美学上令人愉悦,但如果你需要它,你可以使用它。