2014-12-20 4 views
1

스프링 MVC를 기반으로 REST 애플리케이션을 개발합니다. 컨트롤러의상속 대신 스프링 컨트롤러 구성

나는 다음과 같은 한 hierarhy : runtume에서

UserController extends ImageController 
ImageController extends SuggestController // Controller that has GET-DELETE-POST for image 
    SuggestController extends CrudController// Controller that has some suggest methods 
    CrudController // CRUD operations 

그래서 다음했다 매핑 :

/users (POST-GET-PUT-DELETE) 
/users/suggest (GET, POST(Spring Pageable)) 
/users/image (POST-GET-DELETE) 

하나의 컨트롤러가 나에게 이미지를 제공 할 수 있어야, 내가 실현하기 전에 확인했다 "추천"방법을 구현할 수는 없습니다.

하나는 "이미지"기능을 가지고 있지만,이되지 않습니다 "제안"

/things (POST-GET-PUT-DELETE) 
/things/suggest (GET, POST(Spring Pageable)) 

자바는 말한다 : "이러한 경우에 사용 조성물은"

StuffController { 
    @InlineThisController 
    ImageController imagedController; 
    @InlineThisController 
    CrudController crudController; 
... //some additional methods 
} 

그래서 어떻게없이 스프링 MVC에서이 acheive 수

위임을위한 상용구? 특수 효과? XML?

답변

1

스프링 MVC는 방법은 @RequestMapping 주석, 또는 좀 더 정확하게 당신이 @RequestMapping과 함께 최우선 방법에 주석을 허용하지 않고 기본 클래스에 매핑을 사용합니다 오버라이드 (override) 할 수 없습니다.

하지만 기본 클래스에는 항상 두 가지 메소드를 정의 할 수 있습니다. 하나는 @RequestMapping으로 주석 처리되고 두 번째는 주석 처리되지 않습니다. 그런 다음 하위 클래스의 두 번째 메소드를 자유롭게 재정의 할 수 있습니다. 예 : CRUD 컨트롤러

추상 기본 클래스

@Controller 
@RequestMapping(ProcessController.PREFIX) 
public class ProcessController extends AbstractCRUDController<Integer, ProcessQ> { 
    public static final String PREFIX = "/process"; 

    @Override 
    public String getPrefix() { 
     return PREFIX; 
    } 

    @Override 
    protected String doShow(ProcessQ process, HttpSession session, Model model, 
      int pageSize, WebRequest request, boolean all) { 
     String viewName = super.doShow(process, session, model, pageSize, request, all); 
     // specialized processing for class ProcessQ 
     ... 
     return viewName; 
    } 
    ... 
} 

예는 실제 프로그램에서 가져 클래스 ProcessQ에 대한

콘크리트 구현, 그건 당신이 매김 요소를 볼 수있는 이유입니다

public abstract class AbstractCRUDController<K extends Serializable, X> 
// X is the data class, K is the class of the key (int or String) 
    @RequestMapping({"/{data}"}) 
    public String show(@ModelAttribute("data") X data, HttpSession session, Model model, 
      @RequestParam(value = "pagesize", required = false, defaultValue = "-1") int pageSize, 
      WebRequest request, 
      @RequestParam(value = "all", defaultValue = "false") boolean all) { 
     return doShow(data, session, model, pageSize, request, all); 
    } 
    protected String doShow(X data, HttpSession session, Model model, 
      int pageSize, WebRequest request, boolean all) { 
     return this.getPrefix() + "/view"; 
    } 
    @RequestMapping(value={"/{data}/edit"}, method=RequestMethod.GET) 
    public String edit(@ModelAttribute("data") X data, Model model) { 
     return doEdit(data, model); 
    } 

    protected String doEdit(@ModelAttribute("data") X data, Model model) { 
     model.addAttribute("title", editTitle); 
     return this.getPrefix() + "/edit"; 
    } 

    @RequestMapping(value={"/{data}/edit"}, method=RequestMethod.POST) 
    public String update(@ModelAttribute("data") X data, BindingResult result, Model model) { 
     if (data == null) { 
      throw new NoSuchElementException(); 
     } 
     if (save(data, result, model, SimpleSaveType.UPDATE, null) != null) { 
      return "redirect:" + savedUrl(data); 
     } 
     else { 
      model.addAttribute("title", editTitle); 
      return getPrefix() + "/edit"; 
     } 
    } 

    public K save(X data, BindingResult result, Model model, SaveType saveType, K id) { 
     ... 
    } 

    ... 
    public abstract String getPrefix(); 
} 
, 오류 처리 및 기본 요청에 대한 액세스.