Impossibile far funzionare correttamente il dispatcher MVC Spring quando il modello URL è un percorso
-
27-10-2019 - |
Domanda
Ho un'app Web che stiamo applicando Spring MVC solo per i servizi di riposo al momento. Vogliamo che i nostri servizi di riposo appaia ${contextPath}/rest/**
, tuttavia, quando ho impostato questo, otteniamo:
Nessuna mappatura trovata per la richiesta HTTP con URI [/myApp/Rest/Testsvc/Message] In Dispatcherservlet con nome 'Spring MVC Dispatcher Servlet'
Mio web.xml
ha:
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/rest</url-pattern>
</servlet-mapping>
servlet-context.xml
, che va bene e registra servizi man mano che vengono registrati all'avvio.
<context:component-scan base-package="com.mycompany.myapp.rest" />
<mvc:annotation-driven />
Il mio controller sembra segue:
@Controller
@RequestMapping(value = "/rest/testService")
public class TestREST {
@RequestMapping(value="message", method=RequestMethod.GET)
public @ResponseBody String getMessage() {
return "REST working";
}
Se ho cahnge il url-pattern
in web.xml
a *.rest e la mia mappatura di richiesta per message
a message.rest
funziona.
Soluzione
Il problema è probabile che tu abbia ripetuto il /rest
prefisso in entrambi web.xml
e @RequestMapping
. Dovrebbe essere in uno o in uno dei due, ma non entrambi, ad esempio
<url-pattern>/rest</url-pattern>
e
@RequestMapping(value = "/testService")
I percorsi su cui @RequestMapping
opera sono le parti del percorso che segue la parte servlet e il tuo web.xml
definisce la parte del servlet come /path
, Così @RequestMapping
corrispondenze contro qualunque cosa rimanga, cioè /testService
.
Nella sua forma attuale, il tuo @RequestMapping
sta effettivamente abbinando contro {contextPath}/rest/rest/testService
.
Altri suggerimenti
Forse potresti provare a cambiare in <url-pattern>/rest/*</url-pattern
> o <url-pattern>/rest*</url-pattern
> E vedi se questo aiuta.