Подтвердить что ты не робот

Использование <mvc: resources.../"> в spring 3 заставляет все остальные виды перестать работать

Простейший пример:

У меня есть диспетчерский сервлет, настроенный на все:

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

У меня есть простой тестовый контроллер:

@RequestMapping("/index")
@ResponseBody
public String rootTest(){
    return "Main page displayed from TestController";
}

В этом тестовом случае я добавляю (или удаляю) следующую строку в dispatcher-servlet.xml:

<mvc:resources mapping="/public/**" location="/public/"/>

Моя высокая цель: использовать статический контент (изображения, css, js) вместе с моим динамическим контентом (созданным через Velocity в контейнере сервлетов Jetty, связанным вместе с всемогущим Spring).

Моя дилемма: Когда я добавляю <mvc:resources .../>, я получаю 404 для http://localhost/index, но я могу служить изображением из http://localhost/public/img/42.png. Если я удаляю <mvc:resources .../>, тогда http://localhost/index работает нормально, но, конечно, как мне статичный контент?

Бонусный вопрос: Почему у меня никогда не бывает торта и есть его?

4b9b3361

Ответ 1

Есть 2 проблемы:

  • Никогда не используйте /* в отображении сервлета:

    <servlet-mapping> 
        <servlet-name>dispatcher</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    
  • <mvc:resources> требует <mvc:annotation-driven> (или явно объявленных сопоставлений обработчиков и т.д.).

    Это происходит из-за того, что DispatcherServlet применяет конфигурацию сопоставлений по умолчанию по умолчанию только в тех случаях, когда в контексте не обнаружено сопоставлений пользовательских обработчиков. Поскольку <mvc:resources> добавляет свое собственное сопоставление обработчиков, значения по умолчанию не работают, поэтому сопоставления других обработчиков должны быть декалированы явно, либо <mvc:annotation-driven>, либо вручную как beans.

    Также обратите внимание, что <mvc:resources> объявляет только DefaultAnnotationHandlerMapping и не объявляет другие сопоставления, такие как BeanNameUrlHandlerMapping, хотя они по умолчанию имеют значение DispatcherServlet. Объявите их вручную, если они вам понадобятся.

Ответ 2

Я также встречал эту проблему раньше. Моя ситуация была Я не помещал все фреймы размером 62 spring в файл lib (spring -framework-4.1.2.RELEASE edition), это действительно сработало. И затем я также изменил 3.0.xsd на 2.5 или 3.1 для теста, все получилось. Конечно, есть и другие факторы, влияющие на ваш результат.