寻找实施订单管理模块的有效方法。有不同的订单类型(约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如何能够将请求参数正确映射到订单实例,因为它不知道要实例化哪个订单实例。
是否可以使用单个控制器实现此目的,还是应该为每个订单类型使用控制器并在所有订单类型中复制相同的代码?
答案 0 :(得分: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>
用这种方法能够达到预期的效果。但不确定这种方法是否会导致任何其他问题。请建议。