Search code examples
spring-websocket

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


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>


Solution

  • 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