Spring root应用程序上下文和servlet上下文混淆

 mobiledu2502905597 发布于 2023-01-31 17:49

我知道我需要注册@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,正如预期的那样它不会看到SimpMessagingTemplatebean并抛出NoSuchBeanDefinitionException

    如果我正在尝试TimeServiceWs在servlet上下文中创建bean,那么我无法将其自动装配到任何其他服务,因为根上下文无法看到servlet上下文bean(据我所知)

    如果我将所有配置移动到servlet上下文,则会成功创建所有bean,但是我收到以下异常:java.lang.IllegalStateException: No WebApplicationContext found并且无法访问我的webapp

我应该做些什么?在根上下文中应该是什么?servlet上下文应该是什么?你能再次澄清这些背景之间的区别吗?

如果您需要任何其他信息,请告诉我.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有