我知道我需要注册@Controller
在我的servlet上下文中注释的类,以使我的webapp可访问.通常,我按照以下方式进行:
@Configuration @EnableWebMvc @ComponentScan({"foo.bar.controller"}) public class WebConfig extends WebMvcConfigurerAdapter { //other stuff like ViewResolvers, MessageResolvers, MessageConverters, etc. }
我添加到根应用程序上下文中的所有其他配置类.以下是我的dispetcher初始化程序通常如下所示:
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class>[] getRootConfigClasses() { return new Class>[] { RootConfig.class, ServiceConfig.class }; } @Override protected Class>[] getServletConfigClasses() { return new Class>[] { WebConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
但是当我开始使用WebSockets时,事情变得越来越有趣.要使websockets正常工作,您必须将WebSoketConfig.class放入servlet上下文.这是我的WebSocketConfig示例:
@Configuration @EnableScheduling @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS(); } @Override public void configureClientInboundChannel(ChannelRegistration channelRegistration) { channelRegistration.taskExecutor().corePoolSize(4).maxPoolSize(8); } @Override public void configureClientOutboundChannel(ChannelRegistration channelRegistration) { channelRegistration.taskExecutor().corePoolSize(4).maxPoolSize(8); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/queue", "/topic"); registry.setApplicationDestinationPrefixes("/app"); } }
此外,我已经创建了一个服务来向主题发送消息:
@Service public class TimeServiceWsImpl implements TimeServiceWs { @Autowired private SimpMessagingTemplate messagingTemplate; @Override public void sentCurrentTime() { long currentTime = System.currentTimeMillis(); String destination = "/topic/chatty"; logger.info("sending current time to websocket /topic/time : " + currentTime); this.messagingTemplate.convertAndSend(destination, currentTime); } }
我需要在其他服务中使用此服务(自动装配它).而现在我陷入僵局:
如果我正在尝试TimeServiceWs
在根应用程序上下文中创建bean,正如预期的那样它不会看到SimpMessagingTemplate
bean并抛出NoSuchBeanDefinitionException
如果我正在尝试TimeServiceWs
在servlet上下文中创建bean,那么我无法将其自动装配到任何其他服务,因为根上下文无法看到servlet上下文bean(据我所知)
如果我将所有配置移动到servlet上下文,则会成功创建所有bean,但是我收到以下异常:java.lang.IllegalStateException: No WebApplicationContext found
并且无法访问我的webapp
我应该做些什么?在根上下文中应该是什么?servlet上下文应该是什么?你能再次澄清这些背景之间的区别吗?
如果您需要任何其他信息,请告诉我.