Mam dziwny scenariusz, w którym mój kontroler nie jest wywoływany, chyba że zamapuję servlet wysyłający na/* w web.xml. Mam zdefiniowane kontroler z RequestMapping:Spring MVC @RequestMapping nie działa
@Controller
public class UserController {
@RequestMapping(value = "/rest/users", method = RequestMethod.GET)
public ModelAndView getUsers(HttpServletRequest request) throws RestException {
...
}
}
I kontekście aplikacji:
<?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:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<context:component-scan base-package="com.test.rest.controller" />
Wreszcie to jest mapowany w web.xml:
<servlet>
<servlet-name>rest-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/restContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
to działa zgodnie z oczekiwaniami, czyli ja może wysyłać żądania do/reszta/użytkowników. Jednak jeśli mogę zmienić mapowanie web.xml do:
<servlet-mapping>
<servlet-name>rest-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
pojawia się błąd MVC:
WARN servlet.PageNotFound: No mapping found for HTTP request with URI [/rest/users] in DispatcherServlet with name 'rest-servlet'.
Wydaje się naprawdę dziwne, ponieważ błąd wskazuje, że żądanie jest mapowane do dyspozytora-servlet , ale jedyną rzeczą, która się zmieniła jest mapowanie serwletów.
Czy ktoś jeszcze to napotkał?
Dzięki Anton, jedynym Problemem jest to, że mam inne serwlety zdefiniowane obok servletu dyspozytora MVC (rzeczy GWT itp.), więc nie chcę przez to wszystko przekierowywać. Chyba będę musiał spojrzeć na niektóre opcje przepisywania adresu URL. –
Możesz zdefiniować pęczek w deklaracji serwletu. W twoim scenariuszu możesz mapować Spring MVC do/rest a twój kontroler do/users –
Anton
Mam to ... teraz ma to sens, dzięki za pomoc –