2012-03-13 33 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

相關問題