Не найдено сопоставление для HTTP-запроса с URI [/WEB-INF/pages/apiForm.jsp]
Мой обработчик перенаправляет к внутреннему ресурсу view 'apiForm', но затем я получаю ошибку 404 RequestURI=/WEB-INF/pages/apiForm.jsp. Я уверен, что apiForm.jsp находится в / WEB-INF / pages /
13: 45: 02,034 DEBUG [org.springframework.web.servlet.view.JstlView] - Пересылка в ресурс [/WEB-INF/pages/apiForm.jsp] в InternalResourceView 'apiForm'
13: 45: 02,035 DEBUG [org.springframework.web.servlet.DispatcherServlet] - DispatcherServlet с именем 'testapp2', определяющий значение Last-Modified для [/WEB-INF/pages/apiForm.jsp]
13: 45: 02,038 DEBUG [org.springframework.web.servlet.DispatcherServlet] - в getLastModified не найден обработчик
13: 45: 02,038 DEBUG [org.springframework.web.servlet.DispatcherServlet] - DispatcherServlet с именем 'testapp2', обрабатывающим запрос для [/WEB-INF/pages/apiForm.jsp]
13: 45: 02,038 WARN [org.springframework.web.servlet.PageNotFound] - Не найдено сопоставление для HTTP-запроса с URI [/WEB-INF/pages/apiForm.jsp] в DispatcherServlet с именем "testapp2"
13: 45: 02,045 DEBUG [org.springframework.web.servlet.DispatcherServlet] - успешно выполненный запрос
13: 45: 02,048 DEBUG [org.springframework.web.servlet.DispatcherServlet] - успешно выполненный запрос
Вот так выглядит мой dispatcher.xml..
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
16 ответов
Похоже, DispatcherServlet пытается обработать запрос для apiForm.jsp, что говорит мне о том, что ваше сервлет-отображение web.xml направляет запросы на это пространство в DispatcherServlet.
У вас может быть что-то подобное?
<servlet-mapping>
<servlet>dispatcher</servlet>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Попробуйте вызвать ваши контроллеры с другим расширением (например,.do) и обновите отображение сервлета
<servlet-mapping>
<servlet>dispatcher</servlet>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Да, я знаю, что опаздываю на эту вечеринку, но она может помочь другим.
Контейнер сервлета выбирает отображение на основе самого длинного пути, который соответствует. Таким образом, вы можете вставить это отображение для ваших JSP, и оно будет выбрано вместо /* mapping.
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>/WEB-INF/pages/*</url-pattern>
</servlet-mapping>
На самом деле для Tomcat это все, что вам нужно, поскольку jsp - это сервлет, который существует из коробки. Для других контейнеров вам нужно либо узнать имя сервлета JSP, либо добавить определение сервлета, например:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
Просто добавь <mvc:default-servlet-handler />
к вашей конфигурации DispatcherServlet, и все готово!
Вы получите No mapping found for HTTP request with URI
ошибка
если вы отсканировали неправильный пакет
например, ваш контроллер находится в my.package.abc, но вы по ошибке поставили
<context:component-scan base-package="my.package.efg*" />
или же
@ComponentScan("my.package.efg*")
что в том смысле, что ваш контроллер не сканируется в контексте веб-приложения, когда запрос приходит не только по URL, но и по всему классу не найден!
Я думаю, что я прочитал весь Интернет, чтобы выяснить, как заставить sitemesh обрабатывать мои пути HTML без расширения + пути API без расширения. Я был завернут в прямую куртку, чтобы понять это, каждый поворот, казалось, ломал что-то еще. Тогда я наконец наткнулся на этот пост.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>/WEB-INF/views/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>/WEB-INF/decorators/*</url-pattern>
</servlet-mapping>
Введите это в ваш dispatcher-servlet.xml
<mvc:default-servlet-handler/>
Решение, которое мне помогло: не отображать DispatcherServlet
в /*
, сопоставьте это с /
, Окончательный конфиг тогда:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
...
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
С Spring 3.1 и Tomcat 7 я получил следующую ошибку:
org.springframework.web.servlet.DispatcherServlet noHandlerFound Не найдено сопоставление для HTTP-запроса с URI [/baremvc/] в DispatcherServlet с именем appServlet
И мне нужно было добавить в web.xml следующую конфигурацию:
<welcome-file-list>
<welcome-file/>
</welcome-file-list>
И приложение работало!
Простую проверку можно сделать. В настоящее время я использую архитектуру Spring MVC вместе с Hibernate. Я пропустил написание аннотаций @Controller чуть выше имени класса. Это было причиной проблемы для меня.
@Controller
public class MyClass{
...
}
Надеюсь, что эта простая проверка решит вашу проблему.
У меня была такая же проблема, конечно была небольшая разница. История была в том, что когда я убирал нижнюю строку:
<mvc:resources mapping="/resources/**" location="classpath:/resources/" />
Все было в порядке, но при наличии этой строки возникает та же ошибка.
После некоторых проб и ошибок я обнаружил, что должен добавить следующую строку в файл контекста моего весеннего приложения:
<mvc:annotation-driven />
Надеюсь, поможет!
Это также может произойти, когда ваше приложение на самом деле не компилируется, хотя оно все еще запускается в Tomcat. Когда я увидел, что это произошло, он не компилировался, потому что в проекте был указан JDK "для конкретного проекта", и код был проверен на машине, у которой не было этого JDK. Eclipse по умолчанию вместо JRE, а не JDK, и тогда приложение не было скомпилировано.
Чтобы исправить это в нашем конкретном случае, мы просто отключили "Настройки, специфичные для проекта" здесь:
"Проект | Свойства | Java Compiler"
Вот более подробная информация о том, как это сделать: /questions/34053016/kak-mne-poluchit-eclipse-dlya-ispolzovaniya-drugoj-versii-kompilyatora-dlya-java/34053026#34053026
Тот же ответ, что и у Брэда Паркс... больше текста, хотя
У меня была точно такая же проблема, и я попробовал вышеуказанные решения вместе со многими другими, все с отрицательными результатами. Я даже начал с новой свежей среды разработки и просто установил шаблон spring-mvc и попытался запустить его сразу после установки (должно работать, но у меня не получилось)
Для меня проблема заключалась в том, что я использовал jdk1.6 в своем проекте, но моя выбранная среда выполнения в eclipse была jdk1.7. Решением было изменить параметры среды выполнения проекта, чтобы этот проект был установлен в jdk1.6. Щелкните правой кнопкой мыши проект -> Свойства -> Компилятор Java -> Установите флажок "Включить специфические параметры проекта", если он еще не установлен, -> выберите соответствующий jdk (или добавьте, если он не установлен).
Я надеюсь, что это может кому-то помочь и сэкономить время этих людей, потому что я провел последние несколько дней в поисках ответа в каждом уголке Интернета. Я случайно наткнулся на него сам, когда начал отчаяться и искать решение в тех областях, где его (по моему мнению) было бы с меньшей вероятностью найти. знак равно
Мои 2 цента. Спасибо!
Edit1: использовать настройки проекта
Edit2: Только что понял, Брэд Паркс уже ответил на это в этой самой теме. Ну, по крайней мере, я получил "редактор"-баджет из этого =D
К сожалению, это довольно широкое сообщение об ошибке класса. Еще одна вещь, которая может пойти не так, если вы пропустите некоторые классы / банки. Например, если вам не хватает jar-файла с пружинным выражением, сервлет dispatch не сможет найти ваш контроллер, как бы вы ни старались и насколько правильно все остальное настроено.
Я столкнулся с этой проблемой в Eclipse Luna EE. Моим решением было просто перезапустить Eclipse, и он волшебным образом начал правильно загружать сервлет.
Вам нужно иметь контроллер, который сначала отвечает на URL, который затем отображает ваш jsp. Смотрите эту ссылку для решения.
"/openStudentPage" это страница, которую я хочу открыть в первую очередь, я сделал:
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(Model model) {
return "redirect:/openStudentPage";
}
@RequestMapping(value = "/openStudentPage", method = RequestMethod.GET)
public String listStudents(Model model) {
model.addAttribute("student", new Student());
model.addAttribute("listStudents", this.StudentService.listStudents());
return "index";
}
Измените диспетчер имен вашего сервлета на любое другое имя. потому что диспетчер является предопределенным именем для версий spring3,spring4.
<servlet>
<servlet-name>ahok</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ashok</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>