2012-09-13 54 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> 

之所以能够取得理想的结果这种方法。但不确定这种方法是否会导致任何其他问题。请建议。

相关问题