Map подмножество параметров запроса к объекту в spring mvc

100
7

В нашем веб-приложении, используя 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, и это не кажется правильным.


Спасибо!

спросил(а) 2013-02-07T13:27:00+04:00 7 лет, 9 месяцев назад
1
Решение
109

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 вы можете применять больше логики против разбивки на страницы, такие как ведение журнала и проверка и т.д.

ответил(а) 2013-02-07T14:41:00+04:00 7 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема