Tomcat 不算 运行 Spring websocket 并抛出错误 "could not create bean class WebSocketAnnotationMethodMessageHandler"

Tomcat count not run Spring websocket and throw error "could not create bean class WebSocketAnnotationMethodMessageHandler"

Spring websocket 运行 在 Jetty 9.1.1+ 上流畅 但是 运行 在 Tomcat 7.0.63 和 Tomcat 8.0.24

上出错

Tomcat 错误日志

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.socket.messaging.WebSocketAnnotationMethodMessageHandler]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.core.convert.converter.ConverterRegistry.addConverter(Ljava/lang/Class;Ljava/lang/Class;Lorg/springframework/core/convert/converter/Converter;)V at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:108) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:280) ... 27 more Caused by: java.lang.NoSuchMethodError: org.springframework.core.convert.converter.ConverterRegistry.addConverter(Ljava/lang/Class;Ljava/lang/Class;Lorg/springframework/core/convert/converter/Converter;)V at org.springframework.core.convert.support.DefaultConversionService.addScalarConverters(DefaultConversionService.java:132) at org.springframework.core.convert.support.DefaultConversionService.addDefaultConverters(DefaultConversionService.java:75) at org.springframework.format.support.DefaultFormattingConversionService.(DefaultFormattingConversionService.java:90) at org.springframework.format.support.DefaultFormattingConversionService.(DefaultFormattingConversionService.java:65) at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.(SimpAnnotationMethodMessageHandler.java:102) at org.springframework.web.socket.messaging.WebSocketAnnotationMethodMessageHandler.(WebSocketAnnotationMethodMessageHandler.java:44) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126) ... 29 more

App-config.xml

<mvc:annotation-driven />

<context:annotation-config />

<mvc:resources mapping="/static/**" location="/" />

<context:component-scan base-package="com.websocket.config" />

<websocket:message-broker
    application-destination-prefix="/cqp">
    <websocket:stomp-endpoint path="/connect/sockjs">
        <websocket:sockjs />
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic" />
</websocket:message-broker>

Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.core.convert.converter.ConverterRegistry.addConverter(Ljava/lang/Class;Ljava/lang/Class;Lorg/springframework/core/convert/converter/Converter;)

看起来你在 class 路径中有一些旧的 spring-core jar,它在你自己的依赖项之前加载:

ConverterRegistry

/**
 * Add a plain converter to this registry.
 * The convertible sourceType/targetType pair is specified explicitly.
 * Allows for a Converter to be reused for multiple distinct pairs without having to create a Converter class for each pair.
 * @since 3.1
 */
void addConverter(Class<?> sourceType, Class<?> targetType, Converter<?, ?> converter);

关注@since 3.1。所以你应该从那些 3.1 之前的 Spring 罐子中清理 Tomcat classpath。

更新

尝试将 -verbose:class 用于 JVM (Tomcat) 运行 确定加载 ConverterRegistry class 的版本和位置:https://dzone.com/articles/how-use-verbose-options-java