보안을 위해 Shiro를 사용하는 Apache Wicket 1.5 응용 프로그램과 종속성 주입을 위해 Guice를 사용합니다. 페이지의 대부분은 상태 비 저장이지만 일부 모델 개체 (사용자 데이터, 현재 메뉴 상태 등)는 동일한 세션의 모든 요청에서 일관성이 있어야합니다. 이러한 모든 객체에는 논리 (주로 데이터베이스에 액세스하기 위해 원격 EJB3 인터페이스를 사용하는 간단한 파인더 메소드)와 상태가 있으며 모두가 Serializable을 구현합니다.Guice @SessionScoped 주석으로 인해 Shiro에서 IllegalArgumentException이 발생합니다. HttpSession
가 여기에 아이디어를 전달한다 짧은 발췌입니다 :
@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는 세션에서 개체를 저장하는 일부 사용자 지정 키 개체를 사용하는 것, 그리고 시로의 HttpSession이 구현은 처리 할 수 없습니다. 이상하게도 충분하지만이 예외는 모든
@SessionScoped
클래스에서 발생하지는 않지만 둘 이상의 클래스에서는 발생합니다.
Guice가 문자열을 사용하여 키스를 사용하도록하는 방법, HttpSession을 더 호환 가능하게 만드는 다른 방법 등 - 나는 할 수있는 아이디어를 찾기 위해 미친 듯이 웹을 검색해 왔습니다. 도움이되는 정보를 찾는 것처럼 보입니다. 또한 오류 메시지에 대한 검색 결과를 보면 전 지구상에서이 문제가있는 유일한 사람인 것처럼 보입니다 ...
이 방법을 사용할 방법이 있습니까? 아니면 여기서 뭔가 잘못하고있는 걸까요?
'시로 '를 어떻게 초기화합니까? 'ShiroModule'을 설치 한가요? –
'ShiroAopModule'과'ShiroWebModule'을 확장하고'shiro.ini'에 넣을 모든 것을 가지고있는 커스텀 패키지를 설치했습니다. 그것은 또한'SessionScoped.class'를'ShiroSessionScope'에 바인드합니다. 'UsersImpl'을위한 별도의 모듈은 없습니다 -'User' 인터페이스는'@ ImplementedBy'로 주석됩니다. – weltraumpirat
'@ SessionScoped' 대신'@ Singleton'을 사용하면 전체 설정이 잘 작동합니다 : 모든 주사가 작동하고 전체 응용 프로그램이 오류없이 실행됩니다. 단 한 명의 사용자로만 제한됩니다. – weltraumpirat