Spring не удается разрешить представление внутри сервлета

#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 входящего запроса использовался в качестве имени представления, у вас есть несколько вариантов:

  1. Настройте пользовательский интерфейс RequestToViewNameTranslator с желаемым поведением
  2. Добавьте HttpServletResponse параметр к этому методу, если вы хотите выполнить запись в ответ напрямую, а не выполнять разрешение представления.
  3. Измените возвращаемый тип этого метода на 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) {
    ...
}