#java #spring
#java #spring
Вопрос:
Я добавил новый метод / сопоставление к одному из моих сервлетов:
@RequestMapping(value = "/user/prefs/order", method = RequestMethod.POST)
public void updateUsersPrefs(@RequestBody Map<String, ArrayList> body, HttpServletRequest request) {
...
}
но когда я отправляю запрос на этот URL, я получаю внутреннюю ошибку сервера 500 со следующим сообщением об ошибке:
javax.servlet.ServletException: Could not resolve view with name 'user/prefs/order' in servlet with name 'appfinder'
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1029)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Я ни за что на свете не могу понять, почему об этом сообщается. Кто-нибудь может помочь с этим? Если есть еще информация, которую я мог бы предоставить, пожалуйста, дайте мне знать.
Спасибо!
Комментарии:
1. Вместо возврата void попробуйте вернуть строку с желаемым именем представления. Есть другие варианты.
Ответ №1:
Spring обрабатывает @RequestMapping
методы с void
возвращаемым типом следующим образом:
void
— если метод обрабатывает сам ответ (путем прямой записи содержимого ответа, объявляя для этой цели аргумент типаServletResponse
/HttpServletResponse
) или если предполагается, что имя представления неявно определяется черезRequestToViewNameTranslator
(не объявляя аргумент ответа в сигнатуре метода обработчика).
Поэтому, поскольку для этого метода нет HttpServletResponse
параметра, Spring предполагает, что вы хотели бы, чтобы имя представления определялось через RequestToViewNameTranslator
.
Если вы не укажете конкретное, RequestToViewNameTranslator
которое нужно использовать в вашем контексте, то запускается реализация по умолчанию, в которой будет:
просто преобразует URI входящего запроса в имя представления.
Если вы не хотите, чтобы URI входящего запроса использовался в качестве имени представления, у вас есть несколько вариантов:
- Настройте пользовательский интерфейс
RequestToViewNameTranslator
с желаемым поведением - Добавьте
HttpServletResponse
параметр к этому методу, если вы хотите выполнить запись в ответ напрямую, а не выполнять разрешение представления. - Измените возвращаемый тип этого метода на
String
,View, or
ModelAndView`, чтобы иметь возможность указывать представление или имя представления в методе.
Комментарии:
1. У вас небольшая опечатка: «Следовательно, поскольку нет
HttpServletRequest
» должно быть «Следовательно, поскольку нетHttpServlet*Response*
»
Ответ №2:
У меня была эта проблема, и причина заключалась в том, что я использовал tiles framework и не упомянул имя view в tiles-def.xml . После настройки tiles-def.xml была ли проблема решена.
Ответ №3:
У меня также была эта проблема. Я решил это с помощью аннотации @ResponseBody.
Вот так:
@RequestMapping(value = "/user/prefs/order", method = RequestMethod.POST)
@ResponseBody
public void updateUsersPrefs(@RequestBody Map<String, ArrayList> body, HttpServletRequest request) {
...
}