2013-04-09 8 views
4

я работаю над небольшим проектом, и есть существующий код, который я хочу, чтобы очистить от моих изменений, и поэтому мне нужно расширить аннотированный контроллер, но это не работает:Продлить аннотированные контроллеры в Spring MVC

package a; 

@controller 
public class BaseController { 
    // Autowired fields 

    protected x toExtend() { 
     // do stuff 
    } 

    @RequestMapping(value = "/start") 
    protected ModelAndView setupForm(...) { 
     toExtend(); 
     // more stuff 
    } 
} 



package b; 

@controller 
public class NewController extends BaseController { 
    // Autowired fields 

    @Override 
    protected x toExtend() { 
     super.toExtend(); 
     //new stuff 
    } 
} 

Пакет a и b сканируется для контроллеров, и я не могу изменить это. Я действительно не ожидал, что это сработает, потому что @RequestMapping (value = "/ start") избыточно в обоих контроллерах. Из-за этого я получаю исключение.

Итак, мой вопрос заключается в том, можно ли вообще расширять управляемый аннотацией контроллер без изменения BaseController?

+1

Он должен работать, если вы удаляете аннотацию '@ Controller' из вашего' BaseController', если нет причин для ее поддержки там. –

+0

У вас не должно быть 'super.toExtend();' в вашем базовом классе. Не существует метода 'super', называемого' toExtend() ', поскольку родительский класс является' Object'. –

+0

Да, вы правы, это ошибка копирования и я ее отредактировал. –

ответ

6

Вы можете продлить один контроллер пружины другого пружинного регулятора ,

Когда контроллер Spring MVC расширяет другой контроллер, функциональность базового контроллера может быть напрямую использована дочерним контроллером, используя URL-адрес запроса дочернего контроллера. Вы можете получить более подробную информацию здесь Extending Spring controllers

+0

Это, кажется, хорошее решение. Повторное использование базового URL-адреса, используемого контроллером, довольно просто :) –

2

Если аннотация BaseController не может быть удалена, вы можете использовать Adapter Pattern для получения наследования.

@Controller 
public class NewController { 
    // Autowired fields 
    BaseController base; 

    protected x toExtend() { 
     base.toExtend(); 
     //new stuff 
    } 
} 

В обычных случаях, либо BaseController не @Controller аннотацию, следовательно, общие методы контроллера может быть помещены внутрь BaseController быть продлено фактическими контроллерами

+0

Шаблон адаптера потребует изменить toExtend() из защищенного для публичного. Похоже, что невозможно полностью оставить BaseController таким, какой он есть, и я думаю, что я удалю @controller, потому что, похоже, с «самым легким» воспроизвести изменения в случае обновлений. –

Смежные вопросы