我有一个用作 flex-blazeds 端点的 spring 组件(使用 @RemotingDestination
),现在我需要将其重新用作 REST 端点。
除了现有的 blaze-ds servlet 之外,我所做的是创建一个额外的 rest servlet(当然是 DispatcherServlet
类型)。
然后我想使用 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
使用我所有的 spring 上下文文件,其中包括那些组件的组件扫描。
由于 flex-servlet 访问这些由全局上下文扫描的 @Component beans 没有问题,我假设 rest-servlet 也可以访问它们,我只需要将注释添加到组件。
奇怪的是,当我明确地为这些组件所在的包添加组件扫描时,其余调用就起作用了。
这意味着这些组件 bean 被创建了两次,一次用于全局上下文(因为它扫描包含此 flex servlet 扫描的配置文件),一次用于 rest-servlet 上下文(我用一个简单的静态验证了这一点计数器和类上的锁)。
我的问题是为什么 rest-servlet 不能看到 flex-servlet 可以看到的 bean?
最佳答案
虽然 servlet appcontext 确实可以访问来自 ContextLoaderListener
appcontext 的 beans,但在将 HTTP 调用映射到 Controller 时不会引用这些 beans。所有 Controller bean 都必须直接在 servlet 的应用上下文中声明(或扫描),否则它们将被忽略。
我建议您将 REST 入口点注释(即 @RequestMapping
)与 BlazeDS 的注释分开。例如,从您的其他帖子中获取您的 UserService
类:创建一个 UserController
类,在其上放置 REST 注释,然后从 UserController
委托(delegate)给用户服务
。 UserController
将在 servlet 应用上下文中声明,并从 ContextLoaderListener
上下文中注入(inject) UserService
。
关于java - 为什么 WebApplicationContext 无法访问我的 spring 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9679976/