Spring:在一个Web应用程序中配置MVC和WebSocket

时间:2016-09-07 10:32:19

标签: java spring spring-mvc servlets spring-websocket

我目前正在开发一个使用Spring MVC和Spring Websocket的Spring Web应用程序。配置是基于注释的。我使用 AbstractAnnotationConfigDispatcherServletInitializer 类作为初始化程序,我对我应该提供的servlet映射以及我应该这样做的方式感到困惑。

我希望将所有MVC控制器映射到" / webservices /"路径,我的Websocket端点位于" / websockets /"。

在我的 @Configuration 类中,一个用于配置Spring MVC( @EnableWebMVC ),另一个用于Spring WebSocket( @EnableWebSocketMessageBroker EM>)。

我按如下方式实现了我的初始化程序:

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

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

另请注意,我通过在Root Configuration类上使用 @Import 导入了所有配置类。我不确定是否应该导入MVC和Websocket配置,因为我已经在getServletConfigClasses()方法中声明了它们......但是我做到了。

无论如何,直到现在它一直很好用。但我最近在我的应用程序中添加了@PropertySource注释的使用(通过使用 @Value(&#34; $ {}&#34;)表达式来注入我的应用程序属性),并且谢谢我注意到至少WebSocket配置类是......扫描(?)两次:第一次正确注入@Value字段值,但不是第二次(导致错误) )。

在进行故障排除时,我注意到我没有这样做&#34;双重扫描&#34;当我从getServletConfigClasses()方法中删除WebSocketConfiguration类时出现问题:它只被扫描一次,并且正确地注入了属性valye。让我感到惊讶的是,即使没有在getServletConfigClasses()中声明WebSocketConfiguration,&#34; / websockets&#34;端点仍然有效!我的猜测是,由于我的Root配置类上的 @Import ,它被扫描了......但是Spring知道它应该如何将WebSocketConfiguration绑定到&#34; / websockets&#34;路径?

所有这些让我想知道我何时/如何导入配置类。所以这是我的问题:

  1. 我是否真的需要声明两个servlet映射来保持我的服务和websockets路径分开?
  2. 是否有必要声明与Servlet映射一样多的Servlet配置类? (看看如何从getServletConfigClasses()中删除WebSocketConfiguration类并没有改变WebSocket功能...或者它只是一个侥幸?)
  3. Spring会为所有Servlet Config类使用相同的DispatcherServlet吗?或者它会为我提供的每个映射创建一个吗?
  4. 从我尝试的内容来看,Spring无法通过在提供的配置类中使用 @Value 来注入属性,这要归功于getServletConfigClasses()...它仅在通过 @Import ,或标准组件扫描。你觉得合乎逻辑吗?
  5. 感谢您的帮助!

0 个答案:

没有答案