map подмножество параметров запроса к объекту весной 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., есть ли способ весной принять определенное подмножество requestParams из обычного запроса GET и автоматически преобразовать их в объект, поэтому он доступен для использования в методе обработчика контроллера? Раньше я использовал @ModelAttribute, и это не кажется правильным.

Благодаря!

5
nl ja de

1 ответы

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.
}

Я не уверен, как весна волшебным образом достигает этого (без @ModelAttribute), но код выше работает для меня.

Существует еще один способ достичь той же цели, вы можете добиться большего, это весенний АОП.



    
    
    
    

in application context, we declare Aspect bean as well as Pointcut along with advice, which in your case is before advice

следующим является исходный код

    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";
    }

при этом аспект будет перехватывать контроллер весны и заполнять PaginationCriteriaBean на основе параметров запроса, и вы даже можете изменить исходное значение в запросе. Благодаря этой реализации АОП вы можете применять больше логики против разбивки на страницы, такие как ведение журнала и проверка и т. Д.

6
добавлено
Спасибо за всесторонний ответ! Ваше первое решение соответствует моим целям, добавляя объект в виде компонента с запросом. Решение AOP выглядит интересно, но у меня были проблемы с предыдущими оберточными контроллерами с аспектами, мешающими тестированию весенних блоков ... Я не пробовал в 3.2, хотя, возможно, теперь он исправлен.
добавлено автор otter606, источник
Spring Framework and more
Spring Framework and more
839 участник(ов)

чат о spring framework и связанных с ним технологиях. We're discussing: job, tech questions, beer meet up/networking: tech review ,LinkedIn skills, SOF q/a raise up& etc. languages: russian,java,eng.