2013-04-29 21 views
5

Aggiornamento: In qualche modo, dopo un altro giro di regolazioni e ridistribuzione, localhost: 8080/ping-1.0/ping ha iniziato a funzionare. I file di configurazione sono ancora come sotto. Vorrei sapere cosa ho risolto senza saperlo, ma ora è risolto.Spring MVC controller non invocato da Tomcat

Sono stato a lottare con questo per un paio di giorni, ho provato tutti i tipi di soluzioni che ho visto qui e altrove, e nulla ha funzionato. Ho un controller MVC Spring distribuito in Tomcat, ma non posso accedervi.

Strumenti:

Spring 3.2.0
Tomcat 7
Java regolatore 1.6

Spring:

@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> 

Il file WAR è chiamato ping-1.0.war. La distribuzione sembra andare bene. Vedo una directory chiamata da ping-1.0 a $ CATALINA_BASE/webapps e questo 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 è in esecuzione sulla porta 8080. Posso accedere localhost: 8080/manager per esempio. Ma localhost: 8080/ping restituisce un messaggio 404 da Tomcat. Non vedo nulla nei registri tranne un record di una richiesta GET. Nessun errore. Ho provato molte varianti di mapping delle richieste, filtro URL, ecc. E non riesco a farlo funzionare.

+3

È necessario aggiungere il nome del contesto di distribuzione all'URL. Se hai distribuito foo.war, l'URL sarebbe http: // localhost: 8080/foo/ping. Quindi per te è http: // localhost: 8080/ping-1.0/ping – duffymo

+0

Già provato ... non ha funzionato. – pmext

+0

qual è il pacchetto in cui si trova 'PingController' –

risposta

3

Non hai la root di contesto sul tuo URL e in realtà devi avere /ping/ping perché sia ​​il servlet del dispatcher che il tuo ping controller sono mappati su /ping. Prova questo:

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

Già provato, non ha funzionato. Lo stesso messaggio 404. – pmext

+0

Oops, non ho notato che hai anche il servlet del dispatcher mappato su '/ ping', che significa che devi colpire'/ping-1.0/ping/ping' per colpire il tuo controller di ping - Ho aggiornato il mio rispondi con l'URL corretto. Come nota a margine, normalmente mi aspetto che il servlet del dispatcher sia mappato su qualcosa di più ampio come '/'. – clav

+0

Grazie mille. rompermi la testa riguardo a questo ... ho dimenticato completamente la/app/* nel web.xml –

0

Penso che tu abbia configurato Spring in modo errato.

Mi aspetto che il servlet sia il servlet di dispatcher di Spring, non il controller di ping. Questo è ciò che determina dove indirizzare la richiesta. Non hai un servlet del front controller.

Potrei pensare a Spring 2.xe precedenti. Devo ammettere che non sarei corretto se Spring 3.x avesse cambiato la necessità del dispatcher. Ma questo è il modo in cui sono configurate le mie applicazioni.

3
@RequestMapping("/ping") 

Mezzi /ping relativo all'URL servlet dispatcher in ascolto.

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

Ecco il problema. Questo fa sì che il servlet del dispatcher ascolti solo un URL e un solo URL. E questo è presumibilmente localhost:8080/ping-1.0/ping. Ma il tuo metodo di controllo è relativo a quello, quindi sarebbe localhost:8080/ping-1.0/ping/ping, e il servlet disptacher non reagisce su quell'URL.Devi usare un modello:

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

Ora il servlet dispatcher può ascoltare su tutti gli URL che iniziano con localhost:8080/ping-1.0/ping.

Un'ultima nota: a seconda della configurazione, potrebbe essere necessario omettere ping-1.0.

Problemi correlati