Почему Tomcat возвращает ошибку HTTP500? - PullRequest
0 голосов
/ 04 марта 2012

Я создал свою собственную сессию, субкласс WebSession.В консоли Tomcat я вижу, что выдается исключение:

pqlrd.is.seguridad.SesionPQLRD cannot be cast to org.apache.wicket.Session

Моя расширенная веб-сессия:

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 ]

1 голос
/ 04 марта 2012

pqlrd.is.seguridad.SesionPQLRD не может быть приведен к org.apache.wicket.Session

Это говорит о том, что что-то пытается привести один из ваших SesionPQLRD объектов к org.apache.wicket.Session, и ваш класс не наследует и не расширяет этот класс.На первый взгляд, это чепуха.Согласно исходному коду, ваш класс явно является подклассом WebSession, а WebSession является подклассом Session.Итак, что дает?

Ну, я думаю, что наиболее вероятное объяснение состоит в том, что ваш Tomcat загружает две копии классов Session / WebSession, используя разные загрузчики классов.И наиболее вероятной причиной этого является то, что у вас есть два веб-приложения в одном контейнере, которые совместно используют объекты.Если у каждого веб-приложения есть свои копии JAR-калитки, содержащие классы Session и WebSession, то у каждого будет своя версия этих классов.Когда одно из ваших веб-приложений попытается использовать экземпляры, созданные другим, типы будут несовместимы, а типы приведут к ошибке.

Существует два простых способа избежать этого:

  • прекратить совместное использование объектов между двумя веб-приложениями или

  • удалить файлы JAR из каталогов lib веб-приложений и поместить их в каталог общей библиотеки.

1 голос
/ 04 марта 2012

То, что SessionPQLRD is-a WebSession (следовательно, Session) не означает WebSession is-a SessionPQLRD. Вы пытаетесь заставить WebSession быть SesionPQLRD, но если Wicket не будет использовать ваш собственный сеанс вместо своего собственного, он вернет фреймворк по умолчанию.

Короче говоря, вы не можете заставить суперкласс действовать как подкласс, если он не может фактически выполнить контракт подкласса. Рассмотрим интерфейс Animal, реализацию ZooAnimal и подкласс Zebra. ZooAnimal может быть не Zebra, а Giraffe.

0 голосов
/ 22 апреля 2013

Убедитесь, что вы также переопределяете метод newSession в классе WicketApplication.Вам необходимо указать Wicket, какой класс сеанса он должен использовать.

public class WicketApplication extends WebApplication {

   //...

   @Override
   public Session newSession(final Request request, final Response response) {
       return new SessionPQLRD(request);
   }
}
...