Это довольно сложно
Интерфейс прост:
public interface HttpSessionListener extends EventListener {
public default void sessionCreated(HttpSessionEvent se);
public default void sessionDestroyed(HttpSessionEvent se);
}
Но если мы посмотрим на реализацию Apache Tomcat WsSessionListener , мы увидим, что онотсутствует метод sessionCreated
, поэтому JVM предполагает, что класс abstract
public class WsSessionListener implements HttpSessionListener{
private final WsServerContainer wsServerContainer;
public WsSessionListener(WsServerContainer wsServerContainer) {
this.wsServerContainer = wsServerContainer;
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
wsServerContainer.closeAuthenticatedSession(se.getSession().getId());
}
}
Так как же Apache Tomcat компилирует свой собственный код?В реализации Apache Tomcat того же интерфейса они объявили эти методы как default
, поэтому при реализации классов не нужно объявлять эти методы.
public default void sessionCreated(HttpSessionEvent se) {
}
public default void sessionDestroyed(HttpSessionEvent se) {
}
Решение вашей проблемыбыло бы удалить зависимость Servlet API из вашего скрипта сборки.
provided "javax.servlet:javax.servlet-api:3.1.0"
, если вам все еще нужен этот API, замените его на Apache Tomcat
provided "org.apache.tomcat:tomcat-servlet-api:9.0.19"