【发布时间】:2013-12-11 11:13:38
【问题描述】:
我有一个 Apache Wicket 1.5 应用程序,它使用 Shiro 来保证安全性,并使用 Guice 来进行依赖注入。 它的大部分页面都是无状态的,但我的一些模型对象(用户数据、当前菜单状态……)需要在同一会话中的所有请求中保持一致。所有这些对象都有逻辑(主要是使用远程 EJB3 接口访问数据库的简单查找器方法)和状态,并且都实现了 Serializable。
这里有一个简短的摘录应该传达这个想法:
@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.
显然,Guice 似乎使用了一些自定义的 Key 对象来存储会话中的对象,而 Shiro HttpSession 实现无法处理这一点。但奇怪的是,并非所有@SessionScoped 类都发生此异常,但肯定不止一个。
我一直在疯狂地搜索网络,寻找我能做什么的想法 - 一些强制 Guice 使用字符串作为键的方法,一些其他让 HttpSession 更兼容的方法,任何东西 - 但我似乎无法找到任何有用的信息。另外,从我对错误信息的搜索结果来看,我似乎是这个星球上唯一有这个问题的人......
有什么办法可以做到这一点吗?还是我在这里做错了什么?
【问题讨论】:
-
如何初始化
Shiro?通过安装ShiroModule? -
我安装了
ShiroAopModule和一个自定义的扩展ShiroWebModule并拥有您本来可以放入shiro.ini的所有内容。这也将SessionScoped.class绑定到ShiroSessionScope。UsersImpl没有单独的模块 - 接口Users用@ImplementedBy注释。 -
如果我使用
@Singleton而不是@SessionScoped,整个设置工作正常:所有注入工作,整个应用程序运行没有错误 - 除了它仅限于单个用户,当然。
标签: java guice shiro java-ee-5 wicket-1.5