2012-08-17 74 views
0

我有一個類@RequestMapping不會也不例外

@Controller 
@RequestMapping("/auth") 
public class LoginController { 


@RequestMapping(value = "/login", method = RequestMethod.GET) 
public String getLoginPage(@RequestParam(value="error", required=false) boolean error, 
    ModelMap model) { 

} 

} 

的web.xml

<servlet> 
<servlet-name>spring</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
       classpath:META-INF/spring-servlet.xml 
     </param-value> 
    </init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 

appcontext.xml

<mvc:annotation-driven/> 

<context:component-scan base-package="mysrc.src"/> 

春天servlet.xml中

<context:component-scan base-package="mysrc.src"/> 

      <mvc:annotation-driven/> 
工作

我得到一個錯誤,如「沒有在調度員發現映射等等等等」

但現在我可以看到在控制檯上沒有例外。

我只看到404

http://localhost:9090/app/auth/login 

我把斷點getLoginPage方法在調試模式,但沒有流量。

除了建議,我想問我怎麼能確定春天已經掃描了一個意識到我的@RequestMapping類?搜索啓動控制檯也許?

回答

3

通常當你得到一個沒有來自Spring的錯誤信息的404時,它通常意味着你的應用程序部署在與你所期望的不同的上下文中。例如,你的代碼示例表明你正在將你的web應用程序部署到/,你確定它在哪裏被部署?你在使用tomcat嗎?如果是這樣,你的webapp應該被命名爲ROOT.war。你能提供更多的細節,比如你在哪裏/如何部署你的web應用程序,也可能是web.xml?

就你的映射而言,Spring將在INFO日誌級別記錄它掃描的控制器以及它們的請求路徑。如果調度程序servlet無法將您的請求與控制器相匹配,則它將始終給出錯誤消息,因此沒有任何錯誤消息表明您的請求未通過調度程序servlet。

+0

我在Eclipse中構建源代碼並在Eclipse中清除Tomcat。我無法在Tomcat/webapps下找到名爲dir的myapp。我認爲你對調度程序servlet沒有意識到我的請求是正確的。因爲當我從源碼中刪除我的LoginController時,清理所有內容,調度程序仍然不會告訴它找不到任何東西。那麼,如何讓調度員servlet知道我的reuqest。謝謝。 – merveotesi 2012-08-18 14:59:17

+0

我的控制器的構造函數在服務器啓動過程中運行。那麼,如何讓調度員servlet知道我的請求? – merveotesi 2012-08-22 07:22:49

1

您的請求映射看起來正確。

您可以爲您的控制器創建一個構造函數,並在其中放置一個日誌語句或一個斷點,以查看該控制器是否由spring創建。

請注意,您的組件掃描也會初始化控制器兩次(一次爲appcontext.xml,一次爲servlet.xml)。你應該添加過濾器,以確保控制器僅從servlet.xml中創建:

appcontext.xml(除控制器一切):

<context:component-scan base-package="x.y.z"> 
    <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" /> 
</context:component-scan> 

servlet.xml中(僅控制器):

<context:component-scan base-package="x.y.z" use-default-filters="false"> 
    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
</context:component-scan> 

可以肯定的是:component-scanbase-package屬性必須是有效的java包,而不是src目錄的路徑(mysrc.src看起來有點像src文件夾;-))

+0

您的信息似乎非常有價值。當我可以測試你的信息時,我會告訴結果。謝謝。 – merveotesi 2012-08-18 15:03:49