0

我有 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)一切都会恢复正常。

    @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("E")添加到最后一个 return 语句)

问题: 我应该坚持这个技巧还是可能会错过配置中的某些内容?提前致谢。

4

1 回答 1

1

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

于 2017-08-10T11:02:19.743 回答