Подтвердить что ты не робот

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)

Я не могу для жизни меня понять, почему это сообщается. Может кто-нибудь помочь с этим? Я больше информации, которую я мог бы предоставить, сообщите мне.

Спасибо!

4b9b3361

Ответ 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) {
    ...
}