Java 为什么不是';WebApplicationContext不能访问我的spring组件吗?
我有一个spring组件,它曾被用作FlexBlazeDS端点(使用Java 为什么不是';WebApplicationContext不能访问我的spring组件吗?,java,spring,spring-mvc,blazeds,Java,Spring,Spring Mvc,Blazeds,我有一个spring组件,它曾被用作FlexBlazeDS端点(使用@RemotingDestination),现在我需要将其重新用作REST端点 除了现有的blaze ds servlet之外,我还创建了一个额外的rest servlet(类型为courser的DispatcherServlet) 然后我想使用REST访问相同的组件(因此我之前的版本),我发现我得到了一个404 我的rest-servlet.xml配置文件如下所示: <mvc:annotation-driven />
@RemotingDestination
),现在我需要将其重新用作REST端点
除了现有的blaze ds servlet之外,我还创建了一个额外的rest servlet(类型为courser的DispatcherServlet
)
然后我想使用REST访问相同的组件(因此我之前的版本),我发现我得到了一个404
我的rest-servlet.xml配置文件如下所示:
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
</bean>
我的ContextLoaderListener
使用所有spring上下文文件,其中包括这些组件的组件内容扫描
由于FlexServlet访问这些@Component bean没有问题,这些bean是由全局上下文扫描的,所以我假设RESTServlet也可以访问它们,我只需要向组件添加注释
奇怪的是,当我明确地为这些组件所在的包添加组件扫描时,rest调用起作用了
这意味着这些组件bean被创建了两次,一次用于全局上下文(当它扫描包含flex servlet扫描的配置文件时),另一次用于rest servlet上下文(我用一个简单的静态计数器和类上的锁验证了这一点)
我的问题是为什么rest servlet看不到flex servlet可以看到的bean?您需要使用SpringWeb上下文并定义DispatcherServlet,它将是ContextLoaderListener加载的bean的子上下文 应该加载rest-servlet.xml的是DistpatcherServlet,而不是ContextLoaderListener。否则,那些你称之为“servlet”的家伙,事实上,我认为他们是控制器,就不会从你的客户那里得到请求 您可以在这里阅读所有这些内容:
这是在Spring中处理Web相关事务的标准方法,您肯定需要遵循它。虽然servlet appcontext确实可以从
ContextLoaderListener
appcontext访问bean,但在将HTTP调用映射到控制器时不会参考这些bean。必须直接在servlet的appcontext中声明(或扫描)所有控制器bean,否则将忽略它们
我建议您将REST入口点注释(即
@RequestMapping
)与BlazeDS注释分开。例如,从你的另一篇博文中选取你的UserService
类:创建一个UserController
类,将其余的注释放在上面,然后从UserController
委托给UserService
UserController
将在servlet应用程序上下文中声明,并从ContextLoaderListener
上下文注入UserService
。嗨,你认为我为什么没有使用dispatcherservlet?我明确表示我正在使用它。如果你能重读我的问题,我将不胜感激,因为它说明了这一点there@Ittai:对不起。我想,“创建一个额外的RESTservlet(DispatcherServlet类型)”把我搞砸了。。。因为DispatcherServlet不是REST servlet。没问题。“DispatcherServlet不是REST servlet”是什么意思?你的意思是说它只是一个“常规”servlet,然后我可以随意使用它吗?(我知道)或者用另一种意思(比如有一个SpringRESTServlet)?@Ittai:我只是说DispatcherServlet是一个通用的servlet,其余的实际上是由控制器实现的。所以,当我读到“DispatcherServlet类型的RESTServlet”时,我的脑海里混合了一些东西。我想:“看来我需要解释一下,这东西是怎么工作的。”再次抱歉!谢谢你的解释。你能给我介绍一个资源来指定这个spring决策吗(“当把HTTP调用映射到控制器时,不会参考那些bean”)@Ittai:不,不是真的。这就是它的工作方式,我认为文档中没有明确说明。