2012-02-17 80 views
0

我想出來一個主控制器,將負責根據需要調用多個控制器(一個或多個),合併數據,過濾數據並將其返回。消費者不需要擔心繫統中的這些多個端點。他們只是談論這個主要終點。春天控制器來調用其他控制器

這是正確的做法嗎?請建議

ModelAndView handle(HttpServletRequest request, HttpServletResponse response) throws Exception { 

    final HandlerMapping handlerMapping = applicationContext.getBean(HandlerMapping.class); 
    final HandlerExecutionChain handler = handlerMapping.getHandler(request); 
    assertNotNull("No handler found for request, check you request mapping", handler); 

    final Object controller = handler.getHandler(); 
    // if you want to override any injected attributes do it here 

    final HandlerInterceptor[] interceptors = 
     handlerMapping.getHandler(request).getInterceptors(); 
    for (HandlerInterceptor interceptor : interceptors) { 
     final boolean carryOn = interceptor.preHandle(request, response, controller); 
     if (!carryOn) { 
      return null; 
     } 
    } 

    final ModelAndView mav = handlerAdapter.handle(request, response, controller); 
    return mav; 
} 

@RequestMapping(value = "/query", method = RequestMethod.POST) 
public ModelAndView execute() throws Exception { 
    request.setRequestURI("/test.html"); 
    request.setMethod("GET"); 
    return handle(request, response); 
} 

回答

1

Spring MVC框架已經是這個主控制器。

子控制器的類註解爲@Controller和過濾器爲Handler Interceptor,且必須實現HandlerInterceptor接口(或擴展HandlerInterceptorAdapter

因此,爲了回到你的問題:「這是正確的做法? 「 - 不是,因爲它已經存在。

+0

但我需要一個控制器,可以使用多個控制器。 – Srini 2012-02-17 13:12:45

+0

假設如果UI需要3個休息端點的數據。而不是UI進行所有這些調用,我得到了可以與其他控制器一起工作的Contoller(3個端點),過濾數據並將其返回。而不是3個http請求,我用1個http請求來完成。 UI與這一個主要端點進行對話。感謝您的反饋。 – Srini 2012-02-17 13:19:09

+0

所以你有一個控制器和不同的服務? – Ralph 2012-02-17 13:40:58

0

爲什麼不創建1個控制器(主控制器),然後自動裝載您需要的控制器並調用這些控制器的方法。

例如,

@Controller 
public class MasterController { 
    @Autowired 
    private Controller1 controller1; 
    @Autowired 
    private Controller1 controller2; 

    @RequestMapping("/master/sample") 
    public Sample getSample() { 
     Sample sample1 = controller1.getSample(): 
     Sample sample2 = controller2.getSample(): 
     // additional processing 
    } 
} 

@Controller 
public class Controller1 { 
    @RequestMapping("/controller1/sample") 
    public Sample getSample() { 
     return something; 
    } 
}