Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:在一个web应用程序中同时配置MVC和WebSocket_Java_Spring_Spring Mvc_Servlets_Spring Websocket - Fatal编程技术网

Java Spring:在一个web应用程序中同时配置MVC和WebSocket

Java Spring:在一个web应用程序中同时配置MVC和WebSocket,java,spring,spring-mvc,servlets,spring-websocket,Java,Spring,Spring Mvc,Servlets,Spring Websocket,我目前正在开发一个SpringWeb应用程序,它同时使用SpringMVC和SpringWebSocket。配置是基于注释的。我使用AbstractAnnotationConfigDispatchersServletInitializer类作为初始值设定项,我对应该提供的servlet映射以及应该提供的方式感到困惑 我希望所有MVC控制器都映射到“/webservices/”路径下,我的Websocket端点映射到“/Websocket/”路径下 在我的@Configuration类中,一个专用

我目前正在开发一个SpringWeb应用程序,它同时使用SpringMVC和SpringWebSocket。配置是基于注释的。我使用AbstractAnnotationConfigDispatchersServletInitializer类作为初始值设定项,我对应该提供的servlet映射以及应该提供的方式感到困惑

我希望所有MVC控制器都映射到“/webservices/”路径下,我的Websocket端点映射到“/Websocket/”路径下

在我的@Configuration类中,一个专用于配置SpringMVC(@EnableWebMVC),另一个专用于SpringWebSocket(@EnableWebSocketMessageBroker)

我实现了我的初始值设定项,如下所示:

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

@Override
protected String[] getServletMappings() {
  return new String[]{"/webservices/*","/websockets/*"};
}
@覆盖
受保护类[]getServletConfigClasses(){
返回新类[]{WebMVCConfiguration.Class,WebSocketConfiguration.Class};
}
@凌驾
受保护的字符串[]getServletMappings(){
返回新字符串[]{“/webservices/*”,“/websockets/*”};
}
另外请注意,我通过在根配置类上使用@Import导入了所有配置类。我不确定是否应该导入MVC和Websocket配置,因为我已经在getServletConfigClasses()方法中声明了它们。。。但我做到了

不管怎么说,到目前为止,这种方式一直运作良好。但我最近在我的应用程序中添加了@PropertySource注释(通过使用@Value(${})表达式注入我的应用程序属性),因此我注意到至少WebSocket配置类是。。。扫描(?)两次:第一次正确注入@Value字段值,但不是第二次(导致错误)

在进行故障排除时,我注意到,当我从getServletConfigClasses()方法中删除WebSocketConfiguration类时,我没有这个“双重扫描”问题:它只被扫描一次,属性valye被正确注入。令我惊讶的是,即使没有在getServletConfigClasses()中声明WebSocketConfiguration,“/websockets”端点仍然可以工作!我的猜测是,它是扫描感谢@Import在我的根配置类。。。但是Spring如何知道它应该将WebSocketConfiguration绑定到“/websockets”路径呢

所有这些都让我想知道我对何时/如何导入配置类的理解。下面是我的问题:

  • 我真的需要声明两个servlet映射来保持我的服务和WebSocket路径的分离吗
  • 是否有必要声明尽可能多的Servlet配置类?(看看从getServletConfigClasses()中删除WebSocketConfiguration类并没有改变WebSocket的功能……还是只是侥幸?)
  • Spring会对所有Servlet配置类使用相同的DispatcherServlet吗?还是会为我提供的每个映射创建一个
  • 从我尝试的情况来看,Spring似乎无法通过在配置类中使用@Value来注入属性,这要感谢getServletConfigClasses()。。。只有通过@Import或标准组件扫描导入时,它才起作用。你觉得合乎逻辑吗

  • 谢谢你的帮助

    一,。不,2。不,3。1.4.不,您对属性解析工作的理解是错误的(属性只能在加载时的同一上下文中解析,因此如果您的根用户加载的
    @Propertysource
    仅在该上下文中对bean可用,而不是在另一上下文中由bean使用,则第二个将失败)。谢谢您的回答@M.Deinum。所以…抱歉,评论超时,我无法编辑我的上一个。。。谢谢你的回答@M.Deinum。至于4.,您的意思是我的属性可用于我的根上下文,但不可用于为WebSocket创建的servlet上下文,对吗?然后,我只需要在相关的配置文件上添加另一个PropertySource注释,我想这样就可以了。今晚我试试看!这就解决了这个问题,但是现在的问题是,您基本上要加载两次应用程序。这不可能是你想要的。是的,至少是一部分。我认为我应该做的第一件事是从根上下文的导入中删除WebMVC和WebSocket配置文件,因为它们有自己的上下文。此外,我刚刚了解到,根上下文中的bean可用于底层上下文(这很有意义:服务通常在根上下文中声明,并可从专用servlet上下文中的控制器访问)。遗憾的是,这与房产不一样……1。不,2。不,3。1.4.不,您对属性解析工作的理解是错误的(属性只能在加载时的同一上下文中解析,因此如果您的根用户加载的
    @Propertysource
    仅在该上下文中对bean可用,而不是在另一上下文中由bean使用,则第二个将失败)。谢谢您的回答@M.Deinum。所以…抱歉,评论超时,我无法编辑我的上一个。。。谢谢你的回答@M.Deinum。至于4.,您的意思是我的属性可用于我的根上下文,但不可用于为WebSocket创建的servlet上下文,对吗?然后,我只需要在相关的配置文件上添加另一个PropertySource注释,我想这样就可以了。今晚我试试看!这就解决了这个问题,但是现在的问题是,您基本上要加载两次应用程序。这不可能是你想要的。是的,至少是一部分。我认为我应该做的第一件事是从根上下文的导入中删除WebMVC和WebSocket配置文件,因为它们有自己的上下文。此外,我刚刚了解到,根上下文中的bean可用于底层上下文(这很有意义:服务通常在根上下文中声明,并可从专用servlet上下文中的控制器访问)。太糟糕了,这对酒店来说是不一样的。。。