我创建了自己的Session,子类WebSession
。在Tomcat控制台中,我可以看到抛出异常:
pqlrd.is.seguridad.SesionPQLRD cannot be cast to org.apache.wicket.Session
My Extended WebSession:
package pqlrd.is.seguridad;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.WebSession;
import org.apache.wicket.request.Request;
import pqlrd.domain.AccesoWeb;
import pqlrd.domain.Usuario;
public final class SesionPQLRD extends WebSession {
public SesionPQLRD(Request request) {
super(request);
// TODO Auto-generated constructor stub
}
private AccesoWeb acceso;
public AccesoWeb getUsuario() {
return acceso;
}
public void setUsuario(AccesoWeb usuario) {
this.acceso = usuario;
}
public static SesionPQLRD getSesionPQLRD(){
return (SesionPQLRD) Session.get();
}
public boolean estaLogeado(){
return (acceso!=null);
}
}
答案 0 :(得分:1)
仅仅因为SessionPQLRD
是一个WebSession
(因此Session
)并不意味着WebSession
是一个SessionPQLRD
。您试图强制WebSession
成为SesionPQLRD
,但除非Wicket知道使用您的自定义会话而不是自己的会话,否则它将返回框架默认值。
简而言之,除非能够实际履行子类的约定,否则不能强制超类像子类一样运行。考虑Animal
接口,ZooAnimal
实现和Zebra
子类。 ZooAnimal
可能不是Zebra
,而是Giraffe
。
答案 1 :(得分:1)
pqlrd.is.seguridad.SesionPQLRD无法强制转换为org.apache.wicket.Session
这表示某些内容正在尝试将您的SesionPQLRD
个对象强制转换为org.apache.wicket.Session
,并且您的类不会继承或扩展该类。从表面上看,这是无稽之谈。根据源代码,您的类显然是WebSession
的子类,WebSession
是Session
的子类。那是什么给出了什么?
我认为最可能的解释是你的Tomcat使用不同的类加载器加载Session
/ WebSession
类的两个副本。最可能的原因是您在共享对象的同一容器中有两个webapp。如果每个webapps都有自己的wicket JAR副本,其中包含Session
和WebSession
类,那么每个类都有自己的类。当您的某个Web应用程序尝试使用另一个Web应用程序创建的实例时,这些类型将不兼容,并且类型转换将失败。
有两种简单的方法可以避免这种情况:
停止在两个webapps之间共享对象,或
从webapps的lib目录中删除JAR文件,并将它们放在共享库目录中。
答案 2 :(得分:0)
确保您还覆盖WicketApplication类中的newSession方法。您需要向Wicket指定它应该使用哪个会话类。
public class WicketApplication extends WebApplication {
//...
@Override
public Session newSession(final Request request, final Response response) {
return new SessionPQLRD(request);
}
}