为什么tomcat返回错误HTTP 500?

时间:2012-03-04 15:43:50

标签: java tomcat wicket

我创建了自己的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);
}

}

3 个答案:

答案 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的子类,WebSessionSession的子类。那是什么给出了什么?

我认为最可能的解释是你的Tomcat使用不同的类加载器加载Session / WebSession类的两个副本。最可能的原因是您在共享对象的同一容器中有两个webapp。如果每个webapps都有自己的wicket JAR副本,其中包含SessionWebSession类,那么每个类都有自己的类。当您的某个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);
   }
}