春天4 @AutoWired失败了

时间:2014-09-09 07:13:52

标签: java spring websocket

我正在尝试websocket示例,在这里我收到错误。

`@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
@Component
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {


      @Autowired
      private SimpMessagingTemplate template;

      private TaskScheduler scheduler = new ConcurrentTaskScheduler();


    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {

        registry.addEndpoint("/simplemessages").withSockJS();
    }

    /**
     * Configure message broker options.
     */
     @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {

        config.enableSimpleBroker("/topic/", "/queue/");
        config.setApplicationDestinationPrefixes("/app");
    }


    @PostConstruct
    private void broadcastTimePeriodically() {
      scheduler.scheduleAtFixedRate(new Runnable() {
         public void run() {

             template.convertAndSend("/topic/simplemessagesresponse", "Updated text "+new Date());


        }
      }, 1000);
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {

    }

   @Override
   public void configureClientOutboundChannel(ChannelRegistration registration) {
      registration.taskExecutor().corePoolSize(4).maxPoolSize(10);
  }

    @Override
    public boolean configureMessageConverters(List<MessageConverter> arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration arg0) {


    }

}  

`

这是我的Spring上下文xml

`

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc.xsd                        
                        http://www.springframework.org/schema/beans                     
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd">



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

    <context:annotation-config/>
    <!-- <annotation-driven /> -->


</beans>

`

 SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSocketConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.messaging.simp.SimpMessagingTemplate com.action.WebSocketConfig.template; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'brokerMessagingTemplate' defined in class path resource [org/springframework/web/socket/config/annotation/DelegatingWebSocketMessageBrokerConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.messaging.simp.SimpMessagingTemplate org.springframework.messaging.simp.config.AbstractMessageBrokerConfiguration.brokerMessagingTemplate()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'brokerMessageConverter' defined in class path resource [org/springframework/web/socket/config/annotation/DelegatingWebSocketMessageBrokerConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.messaging.converter.CompositeMessageConverter org.springframework.messaging.simp.config.AbstractMessageBrokerConfiguration.brokerMessageConverter()] threw exception; nested exception is java.lang.IllegalArgumentException: Converters must not be empty
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:326)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)

任何人都可以让我知道为什么?

2 个答案:

答案 0 :(得分:8)

您的问题在这里:

@Override
public boolean configureMessageConverters(List<MessageConverter> arg0) {
       // TODO Auto-generated method stub
       return false;
}

我知道它是一个自动生成的代码,但在我的测试用例中,我得到了这个StackTrace:

Caused by: java.lang.IllegalArgumentException: Converters must not be empty
    at org.springframework.util.Assert.notEmpty(Assert.java:268)
    at org.springframework.messaging.converter.CompositeMessageConverter.<init>(CompositeMessageConverter.java:43)
    at org.springframework.messaging.simp.config.AbstractMessageBrokerConfiguration.brokerMessageConverter(AbstractMessageBrokerConfiguration.java:266)

这意味着:或者您必须从该方法返回true来注册默认转换器,或者应该将自己的转换器添加到List<MessageConverter>

当我将其更改为返回true时,一切正常。

答案 1 :(得分:0)

我遇到了这个问题,周六晚上的时间花了很多时间试图解决这个问题。 我的问题是我没有在root配置中包含websocket配置。

@Configuration
@ComponentScan({ "xxx.yyy.controllers" })
@Import({SecurityConfig.class, WebSocketConfig.class})
public class RootConfig {

}

然后将其用于app初始化程序

public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { AppConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}