我有一個Apache Wicket 1.5應用程序,使用Shiro作爲安全性,Guice作爲依賴注入。 其大部分頁面都是無狀態的,但我的一些模型對象(用戶數據,當前菜單狀態...)需要在同一個會話中的所有請求中保持一致。所有這些對象都具有邏輯(大多是使用遠程EJB3接口訪問數據庫的簡單查找方法)和狀態,所有這些對象都實現了Serializable。Guice @SessionScoped註釋導致與Shiro HttpSession IllegalArgumentException
下面是一個簡短摘錄要傳達的理念:
@SessionScoped
public class UsersImpl implements Users, Serializable {
private static final long serialVersionUID = 8841809043461673585L;
private final Logger log = LoggerFactory.getLogger(UsersImpl.class);
@Inject
public UserService users;
@Inject
public RoleService roles;
private UserDTO currentUser;
public UserVO findUserByUser(UserVO user) {
UserDTO userDto = null;
try {
userDto = users.findUserByUser(user.toUserDTO());
} catch(Exception e) {
log.error("Error finding user:"+user.id, e);
}
return userDto != null ? new UserVO(userDto) : null;
}
(...)
}
我開發和單元測試使用@Singleton
(爲簡單起見)類,和一切工作正常這種方式,但我得到這樣頻繁出錯,現在,我已經切換到@SessionScoped
生產:
Guice provision errors:
1) Error in custom provider, org.apache.shiro.session.InvalidSessionException:
java.lang.IllegalArgumentException:
HttpSession based implementations of the Shiro Session interface requires attribute keys to be String objects. The HttpSession class does not support anything other than String keys.
顯然,吉斯似乎用一些自定義的關鍵對象的對象存儲在會話,四郎的HttpSession的實現不能處理這個問題。奇怪的是,儘管如此,對於所有的@SessionScoped
類都不會發生這種異常,但肯定是不止一種。
我一直在尋找瘋狂的網絡,尋找一個想法,我可以做些什麼 - 強制Guice使用字符串鍵,其他方式使HttpSession更兼容,任何東西 - 但我不能似乎找到任何有用的信息。另外,根據我的搜索結果判斷錯誤信息,我似乎是這個星球上唯一一個甚至有這個問題的人...
有沒有什麼辦法可以使這項工作成爲可能?或者我在這裏做錯了什麼?
你如何初始化'Shiro'?通過安裝'ShiroModule'? –
我安裝了'ShiroAopModule'和一個自定義擴展了'ShiroWebModule'的東西,並且擁有了一切,否則你會把它放在'shiro.ini'中。這也將'SessionScoped.class'綁定到'ShiroSessionScope'。 'UsersImpl'沒有單獨的模塊 - ''用戶''的界面用'@ ImplementedBy'註解。 – weltraumpirat
整個設置工作正常,如果我使用'@ Singleton'而不是'@ SessionScoped':所有注入都可以工作,並且整個應用程序運行時沒有錯誤 - 當然,只限於單個用戶。 – weltraumpirat