玩2.1-RC2无静态引用的JavaForms validate()

玩2.1-RC2无静态引用的JavaForms validate(),java,playframework-2.0,playframework-2.1,Java,Playframework 2.0,Playframework 2.1,我已经看完这出戏了!2.1按照ZenTasks示例设置基本登录系统的示例。我陷入困境的是JavaForms部分。我想使用通过guicedi提供的auth服务的实例来验证登录请求 我跟在后面。此示例使用静态authenticate()方法在表单提交后请求表单验证时运行身份验证。关于如何在非静态范围内执行此验证步骤,您有何想法 注:我已经看过这出戏了!验证插件以及SecureSocial插件,但是这些项目对于我现在想要做的事情来说是过度的。另外,我对允许JavaForms中的非静态验证的通用解决方案

我已经看完这出戏了!2.1按照ZenTasks示例设置基本登录系统的示例。我陷入困境的是JavaForms部分。我想使用通过guicedi提供的auth服务的实例来验证登录请求

我跟在后面。此示例使用静态
authenticate()
方法在表单提交后请求表单验证时运行身份验证。关于如何在非静态范围内执行此验证步骤,您有何想法

注:我已经看过这出戏了!验证插件以及SecureSocial插件,但是这些项目对于我现在想要做的事情来说是过度的。另外,我对允许JavaForms中的非静态验证的通用解决方案感兴趣

编辑: 我在这里的要求似乎有些混乱。我希望找到一种替代方法来执行由剧本发送的表单提交的验证步骤!framework Form.Form()生成表单。目前,它要求对不是通过DI框架创建的POJO实例调用validate()方法。这导致访问授权服务等需要静态引用

编辑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;
    }
}
公共静态类AuthServiceFormReference{
@注入
公共静态提供者身份验证服务;
}
//在我的身份验证模块中配置()
//...
requestStaticInjection(AuthController.AuthServiceFormReference.class);
//...
公共静态类登录{
@必需的
公共字符串电子邮件;
@必需的
公共字符串密码;
公共字符串验证(){
if(AuthServiceFormReference.authService.get().authenticateAdmin(电子邮件,密码)==null){
返回“无效用户或密码”;
}
返回null;
}
}

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

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

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

User u = User.find.where().eq("username", username).eq("password`,password).findUnique();
if (u == null)
 return "Error.";
else
 return null;
所以这并不是关于Play Framework的,而是关于Java编程的。假设您可以像在任何其他Java程序中一样:

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

    public String validate() { ... }
}
@Configurable
注释使类能够进行依赖项注入。临时限定符确保字段不会被提取为要保存到数据库中的字段


在我的一个项目中,Spring很好地发挥了2/2.1。我不认为模型对象中的依赖注入是美观的,但是如果你需要它,你可以使用它。

这和我链接到的Booal.FraseLogin示例所给出的例子非常相似。我不喜欢这一点的主要原因是因为它需要静态注入。。我希望找到一个解决方案,使我能够执行JavaForm validate()非静态作用域中的功能。我也不喜欢模型对象中的DI,通常只尝试将它们作为POJO的注释保留。我使用DAO层来执行查询等。尽管如此,这并没有真正解决我希望执行Play!JavaForm validate()的核心问题在非静态范围内。我要寻找的是一种在游戏中执行表单验证的替代方法!@Configurable应该能够做您想要做的事情。检查这个问题:。请注意,Spring的AspectJ和Play的Scala编译器并不总是相处得很好,因此您的里程可能会有所不同。