2013-04-29 74 views
5

更新:不知何故,經過又一輪的調整和重新部署,localhost:8080/ping-1.0/ping開始工作。配置文件仍然如下。我希望我知道我在不知情的情況下修正了什麼,但現在已經解決了。未被Tomcat調用的Spring MVC控制器

我一直在摔跤這幾天,嘗試了各種解決方案,我在這裏和其他地方見過,並沒有任何工作。我有一個在Tomcat中部署的Spring MVC控制器,但無法訪問它。

工具:

春3.2.0
的Tomcat 7
的Java 1.6

春控制器:

@Controller 
public class PingController { 

@RequestMapping("/ping") 
public String ping (Model model) throws Exception { 
    System.out.println("ping ping ping"); 
    String s = (new Date()).toString(); 
    model.addAttribute("message", s); 
    return "ping"; 
} 
} 

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

<servlet> 
    <servlet-name>ping</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/ping-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>ping</servlet-name> 
    <url-pattern>/ping</url-pattern> 
</servlet-mapping> 

</web-app> 

平的servlet .xml:

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<context:component-scan base-package="myclass.ping"/> 

<mvc:annotation-driven /> 
</beans> 

WAR文件被稱爲ping-1.0.war。部署似乎很順利。我看到一個名爲平-1.0在$ CATALINA_BASE/webapps中,並在此目錄中catalina.log:

INFO: Mapped "{[/ping],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String myclass.ping.PingController.ping(org.springframework.ui.Model) throws java.lang.Exception 

的Tomcat在8080端口上運行我可以訪問本地主機:例如8080 /經理。但是localhost:8080/ping會從Tomcat返回一條404消息。除了GET請求的記錄外,我在日誌中看不到任何內容。根本沒有錯誤。我已經嘗試了很多變體的請求映射,URL過濾器等,只是不能得到這個工作。

+3

您應該將部署上下文的名稱添加到URL中。如果您部署了foo.war,則URL將爲http:// localhost:8080/foo/ping。所以對你來說它是http:// localhost:8080/ping-1.0/ping – duffymo 2013-04-29 18:58:45

+0

已經嘗試過 - 沒有工作。 – pmext 2013-04-29 19:09:34

+0

「PingController」所在的軟件包是什麼 – 2013-04-30 03:21:46

回答

3

你不必在你的URL的上下文根和實際需要有/ping/ping,因爲這兩個調度servlet和你平控制器被映射到/ping。試試這個:

http://localhost:8080/ping-1.0/ping/ping 
+0

已經嘗試過 - 它沒有工作。相同的404消息。 – pmext 2013-04-29 19:10:04

+0

糟糕,我沒有注意到你的調度器servlet也映射到了'/ ping',這意味着你必須擊中'/ ping-1.0/ping/ping'來打你的ping控制器 - 我更新了我的用正確的URL回答。作爲一個方面說明,我通常會希望調度程序servlet被映射到像'/'這樣更廣泛的東西。 – clav 2013-04-29 19:17:48

+0

非常感謝。打破了我的頭腦......完全忘記了web.xml中的/ app/* – 2016-06-01 12:12:40

0

我想你已經錯誤地配置了Spring。

我期望servlet是Spring的調度程序servlet,而不是您的ping控制器。這就是計算出請求路由的地方。您沒有前端控制器servlet。

我可能認爲Spring 2.x和更早的版本。我承認,如果Spring 3.x改變了調度程序的需要,那麼我會錯誤的。但這就是我的應用程序設置的方式。

3
@RequestMapping("/ping") 

手段/ping相對URL調度的servlet偵聽。

<url-pattern>/ping</url-pattern> 

問題出在這裏。這使得您的調度程序servlet只能監聽一個URL和一個URL。那是假設localhost:8080/ping-1.0/ping。但是你的控制器方法與此相關,所以它將是localhost:8080/ping-1.0/ping/ping,並且調度器servlet不會對該URL做出反應。你必須使用一個模式:

<url-pattern>/ping/*</url-pattern> 

現在調度servlet可以對所有URL 聽開始localhost:8080/ping-1.0/ping

最後一點:根據您的配置,可能需要省略ping-1.0