2012-09-13 83 views
0

尋找一種實施訂單管理模塊的有效方法。有不同的訂單類型(約15)。每個訂單都有獨立的視圖。但是在UI上執行的操作與訂單類型無關。下面是我的DTO的Spring MVC使用單個控制器管理多個視圖

abstract class Order 

abstract class SecurityOrder extends Order 

abstract class TermDepositOrder extends Order 
..... 
..... 
..... 

我想實現能夠管理所有視圖的單個控制器的結構。一些類似下面的一個:

@Controller 
public class OrderController<F extends Order> { 

    public F validate(F order) { 
    } 

    public F insert(F order) { 
    } 
} 

我不知道Spring MVC中如何能夠正確地映射請求參數的單實例,因爲它不知道該實例化的單實例。

單個控制器可以達到這個目標嗎?還是我應該爲每個訂單類型使用控制器,並在所有訂單類型中複製相同的代碼?

回答

0

能夠通過提供自定義方法處理器來實現。以下是示例代碼。

定製實施:

public class OrderControllerArgumentResolver extends 
      ModelAttributeMethodProcessor { 

    public OrderControllerArgumentResolver() { 
      super(true); 
    } 

    @Override 
    public boolean supportsParameter(MethodParameter paramMethodParameter) { 
      //Resolve - custom annotation created to differentiate order parameter from others. 
      //This is to make sure this resolver is used only while resolving OrderDTO is used as method parameter 
      if (paramMethodParameter.getParameterAnnotation(Resolve.class) != null) { 
        return true; 
      } 
      return false; 
    } 

    @Override 
    protected final Object createAttribute(String attributeName, 
        MethodParameter parameter, WebDataBinderFactory binderFactory, 
        NativeWebRequest request) throws Exception { 
      //Instantiate appropriate order instance based on input. 
      return BeanUtils.instantiateClass(OrderTypeEnum.getDTOClass(request 
          .getParameter("orderType"))); 
    } 

    @Override 
    protected void bindRequestParameters(WebDataBinder binder, 
        NativeWebRequest request) { 
      ServletRequest servletRequest = request 
          .getNativeRequest(ServletRequest.class); 
      ServletRequestDataBinder servletBinder = (ServletRequestDataBinder) binder; 
      servletBinder.bind(servletRequest); 
    } 
} 

配置:

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
      <bean 
        class="test.util.OrderControllerArgumentResolver" /> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

之所以能夠取得理想的結果這種方法。但不確定這種方法是否會導致任何其他問題。請建議。

相關問題