ClassCastException:ServletRequestHandledEvent无法强制转换为WebServerInitializedEvent

时间:2017-08-09 20:23:03

标签: spring-mvc spring-boot vaadin8

我正在使用Spring-Boot w Vaadin项目,我必须定义一些Spring-MVC REST控制器。使用Vaadin UI时,一切正常。但是,当我调用任何REST控制器功能时,所有看起来都有效但我可以在日志中看到抛出异常。

1102038 2017-08-09 09:36:12.223 [ajp-nio-8009-exec-5] DEBUG o.s.c.e.SimpleApplicationEventMulticaster - Non-matching event type for listener: org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer$$Lambda$102/980450043@270a6b1b 
java.lang.ClassCastException: org.springframework.web.context.support.ServletRequestHandledEvent cannot be cast to org.springframework.boot.web.context.WebServerInitializedEvent
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:399)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:353)
    at org.springframework.web.servlet.FrameworkServlet.publishRequestHandledEvent(FrameworkServlet.java:1078)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1009)
    at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:892)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:651)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:97)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilterAbstractAuthenticationProcessingFilter.java:200)

由于源代码可用性,我开始调试,发现如果我覆盖 org.springframework.context.event.GenericApplicationListenerAdapter.supportsEventType(ResolvableType eventType),就像下面的一切都恢复正常。< / p>

    @Override
@SuppressWarnings("unchecked")
public boolean supportsEventType(ResolvableType eventType) {
    if (this.delegate instanceof SmartApplicationListener) {
        Class<? extends ApplicationEvent> eventClass = (Class<? extends ApplicationEvent>) eventType.resolve();
        return (eventClass != null &&
                ((SmartApplicationListener) this.delegate).supportsEventType(eventClass));
    } else
        return (this.declaredEventType == null ||
                (this.declaredEventType.isAssignableFrom(eventType) &&
                 !this.declaredEventType.getType().toString().equals("E")));
}

(我已将!this.declaredEventType.getType()。toString()。equals(&#34; E&#34;)添加到最后一个返回语句中

问题: 我应该坚持这个黑客还是可能会错过配置中的某些东西? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的配置中没有错过任何内容。 ClassCastException归因于Spring Framework 5.0 RC3中的a bug。它已在最新快照中修复。您现在可以坚持使用hack,或者您可以通过覆盖pom.xml或build.gradle中的spring.version来切换到使用Spring Framework快照(可从https://repo.spring.io/snapshot获得)。