Spring MVC @RequestParam和@SessionAttribute

时间:2015-11-23 09:12:32

标签: java spring spring-mvc spring-portlet-mvc

我是Spring和Portlet开发的新手。

我正在使用spring-webmvc-portlet,但我认为servlet的工作流程几乎相同。

我的用例很常见但是让一切按照我想要的方式工作还是有点困难。

我有一个这样的控制器:

@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?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以@RequestParam as not required。这将允许您的请求成功,但query将为null。

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

有关RequestParam

的更多详情
相关问题