У меня есть приложение 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
? - person Milan Baran   schedule 26.11.2013ShiroAopModule
и пользовательский, который расширяетShiroWebModule
и имеет все, что вы в противном случае поместили бы вshiro.ini
. Это также связываетSessionScoped.class
сShiroSessionScope
. Отдельного модуля дляUsersImpl
нет - интерфейсUsers
аннотирован@ImplementedBy
. - person weltraumpirat   schedule 26.11.2013@Singleton
вместо@SessionScoped
: все инъекции работают, и все приложение работает без ошибок - за исключением того факта, что оно ограничено одним пользователем, конечно. - person weltraumpirat   schedule 26.11.2013