为什么我的Spring组件不能访问WebApplicationContext?

时间:2012-03-13 07:33:42

标签: java spring spring-mvc blazeds

我有一个spring组件用作flex-blazeds端点(使用@RemotingDestination),我现在需要将其重用为REST端点。

除了现有的blaze-ds servlet之外,我所做的是创建一个额外的rest servlet(类型为DispatcherServlet的courser)。

然后我想使用REST访问相同的组件(因此我以前的question),我发现我得到了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使用我的所有弹簧上下文文件,其中包括这些组件的组件扫描。

由于flex-servlet访问由全局上下文扫描的这些@Component bean没有问题,我认为rest-servlet也可以访问它们,我只需要在组件中添加注释。

奇怪的是,当我明确地为这些组件所在的包添加组件扫描时,其余的调用工作。

这意味着这些组件bean被创建两次,一次用于全局上下文(因为它扫描包含此flex扫描的配置文件)和一个用于rest-servlet上下文(我用一个简单的静态验证了这一点)反击和锁定班级)。

我的问题是为什么rest-servlet不能看到flex-servlet可以使用的bean?

1 个答案:

答案 0 :(得分:1)

虽然servlet appcontext确实能够从<{1}} appcontext访问 bean,但在将HTTP调用映射到控制器时,不会查询这些bean。必须直接在servlet的appcontext中声明(或扫描)所有控制器bean,否则它们将被忽略。

我建议您将REST入口点注释(即ContextLoaderListener)与BlazeDS注释分开。例如,从您的其他帖子中获取@RequestMapping类:创建一个UserService类,将REST注释放在该类上,然后从UserController委派给UserControllerUserService将在servlet app上下文中声明,并使用UserController上下文中的UserService注入。