Spring MVC @RequestParam и @SessionAttribute

Я новичок в разработке Spring и Portlet.

Я использую портлет spring-webmvc, но я думаю, что рабочий процесс почти такой же, как и у сервлетов.

Мой вариант использования довольно распространен, но все еще немного сложно заставить все работать так, как я хотел бы.

У меня есть такой контроллер:

@Controller
@RequestMapping(value = "VIEW")
@SessionAttributes(value = "persons")
public class MyController

// Display a list of person in personList.jsp
@RenderMapping(params = "actionPerson=query")
public String showList() {
  return "personList";
}

@ActionMapping(params = "actionPerson=query"){

  // Here is a trick I use to avoid the MissingPortletRequestParameterException
  // to be raised 
  response.setRenderParameter("query","")
  response.setRenderParameter("actionPerson","query");
}

// Return a list of person and store it in the model
@ModelAttribute("persons")
public List<Person> getPersons(@RequestParam(value="query") String query) {
  List<Person> personList = personService.SearchByName(query);
  return personList;
}

Пока я понимаю, что методы, отмеченные @ModelAttribute, вызываются каждый раз для создания модели перед любым процессом рендеринга.

Я не хочу, чтобы этот метод вызывался каждый раз. Я попытался использовать аннотацию @SessionAttributes для хранения моего списка людей в состоянии разговора с обработчиком.

Моя проблема в том, что аннотация @RequestParam вызывает следующее ожидание:

org.springframework.web.portlet.bind.MissingPortletRequestParameterException: Required String parameter 'query' is not present
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter$PortletHandlerMethodInvoker.raiseMissingParameterException(AnnotationMethodHandlerAdapter.java:559)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:514)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:353)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:155)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:369)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.doHandle(AnnotationMethodHandlerAdapter.java:356)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.handleRender(AnnotationMethodHandlerAdapter.java:296)
at org.springframework.web.portlet.DispatcherPortlet.doRenderService(DispatcherPortlet.java:764)
at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:537)
at org.springframework.web.portlet.FrameworkPortlet.doDispatch(FrameworkPortlet.java:483)
at javax.portlet.GenericPortlet.render(GenericPortlet.java:248)

Я предполагаю, что даже если метод getPersons не вызывается. @RequestParam(value="query) все еще оценивается.

Когда я показываю свой список людей, пользователи могут выбрать человека, чтобы получить подробную информацию. Я хотел бы, чтобы они вернулись к списку результатов, не отправляя новый запрос.

Как я могу правильно справиться с этим случаем? Есть ли способ пропустить оценку @RequestParam?

Спасибо !


person Community    schedule 23.11.2015    source источник


Ответы (1)


Вы можете сделать @RequestParam as not required. Это позволит успешно выполнить ваш запрос, но тогда query будет нулевым.

@ModelAttribute("persons")
public List<Person> getPersons(@RequestParam(value="query" , required=false) String query) {
  List<Person> personList = personService.SearchByName(query);
  return personList;
}

Дополнительные сведения о RequestParam

person Ankur Singhal    schedule 23.11.2015