2015-06-26 1 views
0

В настоящее время у меня возникла проблема при настройке веб-проекта springmvc.springmvc не может вызвать метод контроллера

Ниже мой web.xml

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>0</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 

И я определил мой диспетчерскую-servlet.xml как этот

<context:component-scan base-package="xxx.controller" 

<mvc:annotation-driven /> 

И в пакете xxx.controller Я определяю класс TestController

@Controller 
@RequestMapping(value="/api") 
public class TestController { 


    @RequestMapping(value = "/hello") 
    @ResponseBody 
    public String hello(){ 
     System.out.println("comming hello"); 
     return "hello world"; 
    } 

} 

Теперь, когда я начинаю кот, и хочу получить доступ к localhost:8080/testproject/api/hello, весна сообщает мне

[10: 10: 58 | WARN | (org.springframework.web.servlet.PageNotFound) ] = [отображение не найдено для запроса HTTP с URI [/ TestProject/API/привет] в DispatcherServlet с именем 'диспетчером']

Но если я изменить URL-шаблон в web.xml для

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

Доступно к localhost:8080/testproject/api/hello. Я не знаю, почему это происходит. Я хочу использовать /api/*, а не /.

Может ли кто-нибудь помочь мне настроить отображение пути к контроллеру? Большое спасибо!

ответ

1

Вы рассказываете приложение для запуска в/Context API, когда вы определяете следующее:

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 

так, чтобы получить доступ к контроллеру URL-адрес должен быть локальный: 8080/API/API/привет

Просто избавитесь от/api от вашего диспетчера, как и у вас, и тогда ваше сопоставление должно автоматически по умолчанию указывать на localhost: 8080/api/hello и работать.

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

В противном случае, если вы хотите запустить приложение в контексте/API всегда у вас есть возможность удаления @RequestMapping (значение = «/ апи») с контроллера. Таким образом, он распознает только сопоставление метода.

+0

Извините, но, возможно, вы неправильно поняли мои слова. В настоящее время он работает, когда url-шаблон «/», но не работает, когда url-шаблон «/ api/*». Я хочу, чтобы он работал под вторым шаблоном url. Не могли бы вы рассказать мне, как настроить? –

+1

Это правильно. Если вы хотите, чтобы все приложение было подано из/api/.., тогда сохраните свой web.xml как есть, но затем удалите сопоставление с вашего контроллера @RequestMapping (value = "/ api"). - В вашем в первом примере вы дважды определили отображение/api (web.xml & @RequestMapping), но вам нужно только один раз. – rhinds

+0

Я вижу. Теперь он работает согласно вашему предложению. Большое спасибо! –