Spring MVC очень запутался в отображении контроллеров - PullRequest
4 голосов
/ 28 ноября 2009

Использование сопоставлений контроллера на основе аннотаций.

@Controller
public class AlertsController {

  @RequestMapping(value="create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

При доступе alerts/create я получаю сообщение Does your handler implement a supported interface like Controller?. Это кажется странным и противоречит тому, что написано в документации.

Итак, я добавляю RequestMapping к классу:

@Controller
@RequestMapping("/alerts")
public class AlertsController {

  @RequestMapping(value="create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

Тогда это работает. Мне не нужно ни @RequestMapping, но я делаю. Теперь все становится странно. Я действительно хотел сопоставить это с `/ profile / alerts ', поэтому я изменил это на:

@Controller
@RequestMapping("/profile/alerts")
public class AlertsController {

  @RequestMapping(value="create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

Я получаю 404 при переходе на profile/alerts/create, но он по-прежнему отображается на /alerts/create по какой-то причине?!?!?!

Я изменяю это на:

@Controller
@RequestMapping("foobar")
public class AlertsController {

  @RequestMapping(value="create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

Это очень странно и невероятно неудобно. У кого-нибудь есть способ исправить это или даже отладить происходящее?

Ответы [ 2 ]

4 голосов
/ 28 ноября 2009

В своем первом фрагменте вы пропустили ведущий /. Это должно быть что-то вроде @RequestMapping(value="/create", method=RequestMethod.GET)

Теперь вы должны изменить свой третий фрагмент на этот,

@Controller
public class AlertsController {

  @RequestMapping(value="/profile/alerts/create", method=RequestMethod.GET)
  public void create(HttpServletRequest request, Model model) {
  }
}

Более того, когда вы создаете свой метод void, который ожидает, что DispatcherServlet вернется к имени представления по умолчанию "profile / alerts / create". И тогда это объединено с подходящим решателем представления. Например,

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

А вот у вас 404, может быть.

0 голосов
/ 29 ноября 2009

Вы можете выполнять сопоставление URL как с аннотацией класса, так и с более детальной методикой. Аннотация уровня класса добавляется к примечанию уровня метода

@Controller
@RequestMapping(value = "/admin")
public class AdminController {

  @RequestMapping(value = "/users", method = RequestMethod.GET)
  /* matches on /admin/users */
  public string users() {  ...  }
}

Это очень близко к вашему исходному третьему фрагменту, за исключением того, что вы забыли ведущий /.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...