0

寻找一种有效的方式来实现订单管理模块。有不同的订单类型(大约 15 种)。每个订单都有单独的视图。但无论订单类型如何,在 UI 上执行的操作都是相同的。下面是我的 DTO 的结构

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如何能够正确地将请求参数映射到订单实例,因为它不知道要实例化哪个订单实例。

是否可以使用单个控制器来实现这一点,或者我应该为每种订单类型使用一个控制器并在所有订单类型中复制相同的代码?

4

1 回答 1

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>

能够通过这种方法达到预期的结果。但不确定这种方法是否会导致任何其他问题。请建议。

于 2012-09-14T14:30:47.310 回答