Spring не может разрешить просмотр в сервлет
Я добавил новый метод/отображение в один из моих сервлетов:
@RequestMapping(value = "/user/prefs/order", method = RequestMethod.POST)
public void updateUsersPrefs(@RequestBody Map<String, ArrayList> body, HttpServletRequest request) {
...
}
но когда я отправляю запрос на этот URL-адрес, я получаю 500 Internal Server Error со следующим сообщением об ошибке:
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
Spring обрабатывает методы @RequestMapping
с void
возвращаемым типом следующим образом:
void
- если метод обрабатывает сам ответ (непосредственно для записи содержимого ответа, объявляя аргумент типа ServletResponse
/HttpServletResponse
для этой цели) или если имя представления предполагается неявным образом определить через RequestToViewNameTranslator
(не объявляя ответный аргумент в сигнатуре метода обработчика).
Поэтому, поскольку для этого метода нет параметра HttpServletResponse
, Spring предполагает, что вы хотите, чтобы имя вида определялось с помощью RequestToViewNameTranslator
.
Если вы не укажете конкретный RequestToViewNameTranslator
для использования в вашем контексте, удары по умолчанию, в которых будет:
просто преобразует URI входящего запроса в имя представления.
Если вы не хотите, чтобы URI входящего запроса использовался как имя представления, у вас есть несколько вариантов:
- Настройте пользовательский
RequestToViewNameTranslator
с поведением, которое вы хотели бы
- Добавьте параметр
HttpServletResponse
к этому методу, если вы хотите написать ответ прямо, а не разрешение просмотра.
- Измените возвращаемый тип этого метода на
String
, View, or
ModelAndView`, чтобы иметь возможность указывать имя или представление в методе.
Ответ 2
У меня была эта проблема, и причина в том, что я использовал фреймворк для плитки и не упоминал имя вида в файле 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) {
...
}