Map подмножество параметров запроса к объекту в spring mvc
В нашем веб-приложении, используя Spring MVC 3.2, мы отображаем много разбитых списков разных объектов, а ссылки на другие страницы в списке построены следующим образом:
/servlet/path?pageNum=4&resultsPerPage=10&sortOrder=ASC&sortBy=name
хотя в URL могут быть дополнительные параметры запроса (например, фильтры поиска).
Итак, у нас есть такие методы управления, как это:
@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list")
public String ajaxlistGroups(Model model,
@RequestParam(value="pageNumber",required=false,defaultValue="0") Long pageNumber,
@RequestParam(value="resultsPerPage",required=false,defaultValue="10") int resultsPerPage,
@RequestParam(value="sortOrder",required=false,defaultValue="DESC") String sortOrder,
@RequestParam(value="orderBy",required=false,defaultValue="modificationDate")String orderBy) {
// create a PaginationCriteria object to hold this information for passing to Service layer
// do Database search
// return a JSP view name
}
поэтому мы получаем эту нечеткую сигнатуру метода, повторяющуюся несколько раз в приложении, и каждый метод должен создать объект PaginationCriteria для хранения информации разбиения на страницы и проверки ввода.
Есть ли способ создать наш объект PaginationCriteria автоматически, если эти параметры запроса присутствуют? Например, замените выше:
@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list")
public String ajaxlistGroups(Model model, @SomeAnnotation? PaginationCriteria criteria,
) {
...
}
I.e., есть ли способ в Spring взять определенное подмножество requestParams из регулярного запроса GET и автоматически преобразовать их в объект, чтобы он был доступен для использования в методе обработчика контроллера? Раньше я использовал @ModelAttribute, и это не кажется правильным.
Спасибо!
Spring 3.2 должен автоматически сопоставлять параметры запроса с пользовательской java bean.
@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list")
public String ajaxlistGroups(Model model, PaginationCriteriaBean criteriaBean,
) {
//if PaginationCriteriaBean should be populated as long as the field name is same as
//request parameter names.
}
Я не уверен, как Spring волшебным образом достигнет этого (без @ModelAttribute), но код выше работает для меня.
Существует еще один способ достичь той же цели, вы можете добиться большего, а именно Spring AOP.
<bean id="aspectBean" class="au.net.test.aspect.MyAspect"></bean>
<aop:config>
<aop:aspect id="myAspect" ref="aspectBean">
<aop:pointcut id="myPointcut"
expression="execution(* au.net.test.web.*.*(..)) and args(request,bean,..)" />
<aop:before pointcut-ref="myPointcut" method="monitor" />
</aop:aspect>
</aop:config>
в контексте приложения мы объявляем Аспект bean, а также Pointcut вместе с советом, который в вашем случае перед советом
следующим является исходный код
public class PaginationCriteriaBean {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//custom Aspect
public class MyAspect {
public void monitor( HttpServletRequest request,PaginationCriteriaBean bean){
//populate your pagination bean
bean.setId(request.getParameter("id"));
bean.setName("my new name");
}
}
@RequestMapping(value="/app")
public String appRoot(HttpServletRequest request,PaginationCriteriaBean bean){
System.out.println(bean.getId());
System.out.println(bean.getName());
return "app";
}
делая это, аспект будет перехватывать контроллер Spring и заполнять PaginationCriteriaBean на основе параметров запроса, и вы даже можете изменить исходное значение в запросе. С помощью этой реализации AOP вы можете применять больше логики против разбивки на страницы, такие как ведение журнала и проверка и т.д.
Еще в рубрике
- Вопросы
- Spring-mvc
- Map подмножество параметров запроса к объекту в spring mvc