Spring websocket run smooth on Jetty 9.1.1+ But run error on Tomcat 7.0.63 and Tomcat 8.0.24
Tomcat error log
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;)
Looks like you have there some old spring-core
jar in the classpath, which is loaded before your own dependencies:
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);
Pay attention to the @since 3.1
. So you should clean Tomcat classpath from those pre-3.1 Spring jars.
UPDATE
Try to use -verbose:class
for the JVM (Tomcat) run to determine which version and from where the ConverterRegistry
class is loaded: https://dzone.com/articles/how-use-verbose-options-java