gpt4 book ai didi

java - 为什么 WebApplicationContext 无法访问我的 spring 组件?

转载 作者:行者123 更新时间:2023-11-30 11:46:37 25 4
gpt4 key购买 nike

我有一个用作 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com