Миграция на Spring Annotated Controllers и традиционный метод onSubmit - PullRequest
4 голосов
/ 09 мая 2011

Я пытаюсь перейти с Spring 2.0 на Spring 3.0.

Ранее я определил контроллер MyController, унаследованный от SimpleFormController, и у меня есть некоторая логика, записанная в методе onSubmit.Все мои контроллеры, имеющие методы-обработчики, унаследованы от MyController.Таким образом, логика, записанная в onSubmit из MyController, использовалась для выполнения всех запросов.

Теперь, когда я перехожу к аннотированному контроллеру, где мой контроллер - простое pojo, как я могу гарантировать выполнение onSubmit каждый раз?Одним из способов является вызов onSubmit из всех методов-обработчиков всех контроллеров.Это громоздко

Может кто-нибудь предложить любое возможное решение.Поскольку аннотирование formBackingObject с помощью @ModelAttribute обеспечивает вызов для всех запросов, разве нет аналогии для метода onSubmit?

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Если вы хотите выполнять одно и то же действие перед каждым вызовом какого-либо аннотированного контроллера, вы можете использовать перехватчик. Вы можете написать свой собственный перехватчик, просто реализовав метод preHandle. Затем вам нужно зарегистрировать этот перехватчик в DefaultAnnotationHandlerMapping или в любом отображении обработчика, которое вы используете для отправки на ваши контроллеры. Регистрация перехватчиков объясняется в этой статье: http://www.scottmurphy.info/spring_framework_annotation_based_controller_interceptors

0 голосов
/ 20 мая 2011

Хорошо, поэтому, если я правильно понимаю, вы хотите, чтобы наследование продолжало играть роль в стеке, когда запрос обрабатывается контроллером.Вы можете расширить любой класс в аннотированном POJO @RequestMapping, но вам придется определить метод @override, чтобы аннотировать его.В общем, все, что вы делаете, это вызываете super с аргументами в переопределенном методе.Если вы расширите аннотированный класс, и оба будут объявлены как Controller, вы получите исключение, так как маршрут будет определен более одного раза.

это выглядело бы так

public class Pojo{

    public String someBaseMethod(){
        return "";
    }
}

@Controller
public class ChildController extends Pojo {

    @Override
    @RequestMapping("/do_it")
    public String someBaseMethod() {
        return super.someBaseMethod();
    }
}

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

0 голосов
/ 11 мая 2011

Аннотируйте метод, который вы хотите вызвать.Подпись метода очень гибкая.Посмотрите документы для @ RequestMapping

@RequestMapping(value={"/foo"}, method=RequestMethod.POST)
public String myMethod(many options for parameters) {...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...