2013-01-23 53 views
2

我一直在玩Play! 2.1 ZenTasks示例之後設置基本登錄系統的示例。我陷入困境的是JavaForms部分。我想使用通過Guice DI提供的身份驗證服務實例來驗證登錄請求。玩! 2.1-RC2沒有靜態引用的JavaForms validate()

我跟着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; 
    } 
} 

這是一個不錯的解決辦法,但它仍然依靠靜態注射:(

回答

0

播放框架不提供Dependency Injection開箱即用。但是你可以用吉斯或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編程。

+0

這與Play中給出的例子非常相似!我鏈接到的框架登錄示例。我不喜歡這個主要原因是因爲它需要靜態注入。我希望找到一個解決方案,使我能夠在非靜態範圍內執行JavaForm validate()功能。 – torbinsky

0

假設你use Spring,你可以像在其他的Java程序:

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

    public String validate() { ... } 
} 

@Configurable註釋使得能夠依賴注入的類。瞬態限定符確保該字段不會被拾取爲字段以保存到數據庫中。

Spring在我的其中一個項目中使用Play 2.0/2.1可以正常工作。我不認爲模型對象中的依賴注入是美觀的,但如果你需要它,你可以使用它。

+0

我不喜歡我的模型對象中的DI,並且通常只會嘗試將它們保留爲帶註釋的POJO。我使用DAO層來完成我的查詢等......據說,這並不能真正解決我想要執行Play的核心問題! JavaForm在非靜態作用域中驗證()。我正在尋找的是在Play中執行表單驗證的替代方法! – torbinsky

+0

@Configurable *應該*能夠做你想做的。看看這個問題:http://stackoverflow.com/questions/4703206/spring-autowiring-using-configurable。請注意,Spring的AspectJ和Play的Scala編譯器並不總是相處的很好,所以你的里程可能會有所不同。 – DCKing