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
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