[英]Spring MVC managing multiple views with single controller
寻找实现订单管理模块的有效方法。 有不同的订单类型(大约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如何将请求参数正确映射到订单实例,因为它不知道要实例化哪个订单实例。
是否可以使用单个控制器来实现此目的,还是应该为每种订单类型使用一个控制器,并在所有订单中重复相同的代码?
通过提供自定义方法处理器能够做到这一点。 下面是示例代码。
定制实施:
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>
用这种方法能够达到预期的效果。 但不确定这种方法是否会引起任何其他问题。 请提出建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.