Spring MVC-controller nicht aufgerufen werden von Tomcat
Update: Irgendwie, nach einer weiteren Runde von Anpassungen und Umschichtungen, localhost:8080/ping-1.0/ping angefangen zu arbeiten. Konfigurations-Dateien sind immer noch da unten. Ich wünschte, ich wusste, was ich behoben, ohne es zu wissen, aber es ist nun behoben.
Ich ve wurde kämpfen mit diesem für ein paar Tage, versucht, alle möglichen Lösungen, die ich gesehen habe hier und anderswo, und nichts gearbeitet hat. Ich habe eine Spring MVC-controller bereitgestellt, der in Tomcat, kann aber nicht darauf zugreifen.
Tools:
Spring 3.2.0
Tomcat 7
Java 1.6
Frühjahr controller:
@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>
ping-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>
Die war-Datei wird als "ping" bezeichnet-1.0.Krieg. - Bereitstellung zu gehen scheint fine. Sehe ich ein Verzeichnis namens ping-1.0 in $CATALINA_BASE/webapps und diese in 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 läuft auf port 8080. Ich kann auf localhost:8080/manager zum Beispiel. Aber localhost:8080/ping gibt eine 404-Meldung von Tomcat. Ich sehe nichts in den logs andere als ein Datensatz aus einer GET-Anfrage. Keine Fehler überhaupt. Ich habe versucht, eine Menge von Variationen von request-mapping, URL-filter, etc. und kann einfach nicht damit es funktioniert.
- Sie sollten den Namen der Bereitstellung an den Kontext der URL. Wenn Sie bei der Bereitstellung foo.Krieg die URL localhost:8080/foo/ping. Also für Sie ist es localhost:8080/ping-1.0/ping
- Schon probiert-hat nicht funktioniert.
- was ist das Paket, in dem die
PingController
liegt - Komischerweise, nach einem weiteren go-round, ping-1.0/ping angefangen zu arbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie nicht über das Kontext-Stammverzeichnis auf Ihre URL und Sie wirklich brauchen, um
/ping/ping
weil sowohl der dispatcher-servlet und Ihre ping-controller zugeordnet sind/ping
. Versuchen Sie dies:/ping
, das bedeutet, dass Sie haben zu schlagen/ping-1.0/ping/ping
zu Ihrem hit ping-controller - ich aktualisiert meine Antwort mit der korrekten URL. Als seitliche Anmerkung, ich würde normalerweise erwarten, dass die dispatcher-servlet gemappt werden, um etwas mehr Breite wie/
.Bedeutet
/ping
relativ zu der URL, die der dispatcher-servlet lauscht.Hier kommt das problem. Das macht das dispatcher-servlet, hören Sie eine URL und eine URL nur. Und das ist assumingly
localhost:8080/ping-1.0/ping
. Aber deine controller-Methode ist relativ, also es wärelocalhost:8080/ping-1.0/ping/ping
, und die disptacher servlet reagiert nicht auf die URL. Sie haben ein Muster verwenden:Nun das dispatcher-servlet-listen auf alle URLs beginnend mit
localhost:8080/ping-1.0/ping
.Eine Letzte Anmerkung: Je nach Konfiguration könnte es sein, dass du zu unterlassen hast
ping-1.0
.Ich denke, dass Sie so konfiguriert haben, dass der Frühling falsch.
Ich würde erwarten, dass das servlet zu Spring dispatcher servlet, nicht Ihre ping-controller. Das ist es, was die Figuren hin, wo die route die Anfrage. Sie verfügen nicht über ein front controller servlet.
Konnte ich denken, Spring 2.x und früher. Ich gebe zu, ich würde falsch sein, wenn der Frühling 3.x verändert die Notwendigkeit für den dispatcher. Aber das ist der Weg, meine Anwendungen eingerichtet sind.