Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.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 为什么不是';WebApplicationContext不能访问我的spring组件吗?_Java_Spring_Spring Mvc_Blazeds - Fatal编程技术网

Java 为什么不是';WebApplicationContext不能访问我的spring组件吗?

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 />

我有一个spring组件,它曾被用作FlexBlazeDS端点(使用
@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:不,不是真的。这就是它的工作方式,我认为文档中没有明确说明。