Использование <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
работает нормально, но, конечно, как мне статичный контент?
Бонусный вопрос: Почему у меня никогда не бывает торта и есть его?
Ответы
Ответ 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 для теста, все получилось. Конечно, есть и другие факторы, влияющие на ваш результат.