2012-03-13 71 views
2

我有一个用作flex-blazeds端点的弹簧组件(使用@RemotingDestination),我现在需要将它重新用作REST端点。为什么我的Spring组件不能访问WebApplicationContext?

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

我当时就想使用REST(因此我以前question)来访问相同的部件,我发现,我得到一个404

我休息-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 servlet),另一个用于其他servlet上下文(我用一个简单的静态计数器和类上的锁)。

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

回答

1

尽管servlet appcontext可以访问访问来自ContextLoaderListener appcontext的bean,但在将HTTP调用映射到控制器时,这些bean将不会被查阅。所有控制器bean必须直接在servlet的appcontext中声明(或扫描),否则它们将被忽略。

我建议您将REST入口点注释(即@RequestMapping)与BlazeDS注释分开。例如,从您的其他帖子中获取UserService课程:创建一个UserController课程,将REST注释放在该课程上,并从UserController指定到UserService。将在servlet应用上下文中声明UserController,并从ContextLoaderListener上下文中注入UserService

+0

感谢您的解释。你能否引用我的资源来说明这个春天的决定(“在将HTTP调用映射到控制器时,这些bean将不会被查阅)”? – Ittai 2012-03-13 10:44:33

+0

@ Ittai:不,不是。这只是它的工作方式,我不认为文档明确指出。 – skaffman 2012-03-13 10:45:52

+0

好的,非常感谢。 – Ittai 2012-03-13 10:54:02

0

您需要使用Spring Web上下文并定义一个DispatcherServlet,它将成为ContextLoaderListener加载的子上下文。

它是DistpatcherServlet应该加载您的rest-servlet.xml而不是ContextLoaderListener。否则,你称之为“servlets”的人,实际上我认为他们是控制器,只是不会从你的客户端获得请求。

你可以阅读所有这些东西在这里:http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/mvc.html

这是在春季做网络相关的东西的标准方法,你definetely需要遵循它。

+1

嗨,你为什么认为我没有使用dispatcherservlet?我特别指出我正在使用它。如果您重新阅读我的问题,我会很感激,因为它在那里指定了 – Ittai 2012-03-13 09:34:29

+0

@Ittai:对不起。我想,“创建一个额外的rest servlet(类型为DispatcherServlet)”让我感到困惑......因为DispatcherServlet不是一个REST servlet。 – weekens 2012-03-13 13:55:12

+0

没问题。你是什​​么意思:“DispatcherServlet不是一个REST servlet”?你的意思是它只是一个“常规”的servlet,然后我可以使用它,但是我想要吗? (我知道)或者具有不同的含义(比如有一个spring-rest servlet)? – Ittai 2012-03-17 10:51:27

相关问题