2013-04-09 3 views
4

스프링 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();'가 없어야합니다. 부모 클래스가'Object'이므로'toExtend()'라는'super' 메쏘드가 없습니다. –

+0

예, 맞습니다.이 파일은 복사 붙여 넣기 오류이며 편집했습니다. –

답변

6

확장한다 .

스프링 MVC 컨트롤러가 다른 컨트롤러를 확장하면 기본 컨트롤러의 기능을 하위 컨트롤러의 요청 URL을 사용하여 하위 컨트롤러에서 직접 사용할 수 있습니다. 여기에서 더 자세한 정보를 얻을 수 있습니다. Extending Spring controllers

+0

이것은 좋은 해결책 인 것 같습니다 - 컨트롤러가 사용하는 기본 URL을 다시 매핑하는 것은 아주 간단합니다 :) –

2

BaseController의 주석을 제거 할 수없는 경우 Adapter Pattern을 사용하여 상속을 얻을 수 있습니다. 하나 BaseController@Controller 주석이없는 보통의 경우

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

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

가, 따라서 일반적인 컨트롤러 방법이 BaseController 내부에 넣을 수는 당신이 다른 스프링 컨트롤러가 하나의 스프링 컨트롤러를 확장 할 수 있습니다 실제 컨트롤러

+0

어댑터 패턴은 toExtend()를 protected에서 public으로 변경해야합니다. 그것은 completly 가능한 BaseController 떠날 수없는 것 같아요 및 @ 컨트롤러를 제거 할 것이라고 생각하기 때문에 "가장 쉬운"업데이트의 경우 변경 사항을 재현하는 방법으로 보인다. –

관련 문제