Контроллер Spring MVC — getPathInfo() равен нулю

#spring-mvc #controller

#spring-mvc #контроллер

Вопрос:

Я работал с сервлетом, который необходимо преобразовать в контроллер Spring MVC, чтобы иметь доступ к компонентам spring и т.д. Почему в обычном servlet request.getPathInfo() return not null , но в Spring Controller я получаю нулевое значение? Я знаю, что могу использовать @PathVariable , но интересно, почему результаты этого метода отличаются?

 @RequestMapping(value = {"/test", "/test/*"})
public void test(HttpServletRequest req, HttpServletResponse res) {

    log.info(req.getPathInfo() == null); // true!

    if (req.getMethod().equalsIgnoreCase("get")) {
        // analogue to doGet...
    } else {
        // analogue to doPost...
    }

}
  

Комментарии:

1. какой URL-адрес вы нажимаете?

2. URL: http://localhost:8080/myApp/test/hello . req.getPathInfo() возвращает shuld /hello

Ответ №1:

Я думаю, что решение находится в javadoc getPathInfo()

Дополнительная информация о пути следует за путем сервлета, но предшествует строке запроса и будет начинаться с символа «/».

В случае Spring путь к сервлету является полным путем, следовательно, если вы вызываете getServletPath(), он всегда будет возвращать полный URI, а getPathInfo() ничего не вернет.

Комментарии:

1. К настоящему моменту это, безусловно, должно быть отмечено как правильный ответ.

2. Это здорово, спасибо. Дело в том, что у меня есть этот фильтр, используемый многими различными приложениями, некоторые spring boot, другие нет. Итак, мне нужно провести различие в фильтре между запросом, поступающим из spring boot, или нет. Есть ли хороший способ сделать это, кроме простой проверки как getPathInfo (), так и getServletPath(). Что-то вроде этого ` if(null != getPathInfo()){ path = getPathInfo(); }else{ path = getServletPath(); } `