【问题标题】:Play! 2.1-RC2 JavaForms validate() without static references玩! 2.1-RC2 JavaForms validate() 没有静态引用
【发布时间】:2013-01-23 03:59:33
【问题描述】:

我一直在玩游戏! 2.1 示例按照 ZenTasks 示例设置基本登录系统。我卡住的地方是 JavaForms 部分。我想使用通过 Guice DI 提供的身份验证服务的实例来验证登录请求。

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

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

编辑: 我在这里要求的内容似乎有些混乱。我希望找到的是另一种方法来执行由 Play 发送的表单提交的验证步骤!框架 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;
    }
}

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

【问题讨论】:

    标签: java playframework-2.0 playframework-2.1


    【解决方案1】:

    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 框架,而是一般的 Java 编程。

    【讨论】:

    • 这与Play给出的例子非常相似!我链接到的框架登录示例。我不喜欢这个的主要原因是因为它需要静态注入。我希望找到一个解决方案,允许我在非静态范围内执行 JavaForm validate() 功能。
    【解决方案2】:

    假设您是 use Spring,您可以像在任何其他 Java 程序中一样进行操作:

    @Configurable
    public class MyModel {
        @Autowired
        transient MyService myService;
    
        public String validate() { ... }
    }
    

    @Configurable 注释使类能够进行依赖注入。瞬态限定符确保该字段不会被拾取为要保存到数据库中的字段。

    在我的一个项目中,Spring 与 Play 2.0/2.1 配合得很好。我不认为模型对象中的依赖注入美观,但如果你需要它,你可以使用它。

    【讨论】:

    • 我也不喜欢模型对象中的 DI,并且通常尝试将它们保留为 POJO,仅带有注释。我使用 DAO 层进行查询等...话虽如此,这并没有真正解决我想要执行 Play 的核心问题! JavaForm validate() 在非静态范围内。我正在寻找的是在 Play 中执行表单验证的另一种方法!
    • @Configurable 应该能够做你想做的事。看看这个问题:stackoverflow.com/questions/4703206/…。请注意,Spring 的 AspectJ 的东西和 Play 的 Scala 编译器并不总是相处得很好,所以你的里程可能会有所不同。
    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2013-05-07
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多