我想使用 HK2 DI 根據登錄 Jersey API 的用戶自動注入類的新實例。用戶使用 AuthenticationFilter 類進行登錄,我可以在所有端點中將其放入 @Context SecurityContext 中。問題是我有一個 DAO 類,需要實例化有關用戶的信息。這只是我應該在數據庫上執行查詢的架構。所以我的Dao的構造函數是這樣的:public UserDao(String schemaCompte) { super(schemaCompte);}解決方案似乎是使用工廠通過 HK2 實例化我的 Dao,所以我嘗試創建一個這樣的:public class UserDaoFactory implements Factory<UserDao> { @Context SecurityContext securityContext; @Override public UserDao provide() { User userPrincipal = (User) securityContext.getUserPrincipal(); return new UserDao(userPrincipal.getCode()); } @Override public void dispose(UserDao userDao) { }}綁定是這樣的:bindFactory(UserDaoFactory.class).to(UserDao.class)和實施:@Injectpublic UserSvc(UserDao userDao) { ...}但是這個工廠在我的應用程序的生命周期中被調用得太早,并且 SecurityContext 仍然是空的。據我了解,在運行時執行的解決方案是將工廠綁定為代理,如下所示:bindFactory(UserDaoFactory.class).proxy(true).to(UserDao.class)但是當我這樣做時,我得到一個運行時異常:java.lang.RuntimeException: java.lang.InstantiationException: com.metier.user.UserDao_$$_jvst5c_0如果有人有想法,我已經嘗試了很多事情,但我完全不走運
1 回答

皈依舞
TA貢獻1851條經驗 獲得超3個贊
所以,事實證明我缺少的是@PreMatching
我在 Jersey Api 中注冊的提供程序中的注釋。
此注釋告訴 Jersey 在執行其他所有操作之前執行此過濾器,甚至與調用的端點進行匹配。
因此,在這個過濾器中,我只是讀取了我的令牌,它可以在UserDaoFactory
需要注入用戶帳戶的地方使用。
我制作了一個小型 github 存儲庫來解釋我的觀點: https: //github.com/m4nu56/jersey-hk2以及一篇 Medium 文章:https://medium.com/@mnu/jersey-injection-dependency-example-with -hk2-84ebfb7cb2d2
最后我沒有使用工廠,因為我沒有意識到我可以直接在我的 Dao 構造函數中注入用戶或帳戶。
添加回答
舉報
0/150
提交
取消