Использование <mvc: resources ... /> весной 3 приводит к тому, что все остальные представления перестают работать - PullRequest
46 голосов
/ 30 октября 2010

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

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

<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";
}

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

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

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

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

Дополнительный вопрос: Почему я никогда не могу взять свой пирог и съесть его тоже?

Ответы [ 3 ]

65 голосов
/ 30 октября 2010

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

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

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

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

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

0 голосов
/ 01 июня 2018

добавить строку "mvc: annotation-based" в файл разрешения имен SpringWeb.XML. это работа для меня

0 голосов
/ 12 декабря 2014

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

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