我有一张创建订单的表单。 Order
的{{1}}为List
。
帖子数据可能类似于:
Product
问题是,在我的控制器中,我用
接收订单client_id=123
product[0].id=1
product[1].id=10
product[2].id=14
我想,当Spring实例化Order对象,设置其属性,然后尝试初始化List并添加所有三个产品时。
当@ModelAttribute("order") Order newOrder
是一个抽象类时,这是失败的,就像我的情况一样,并且实际上有3个具体的子类。所以,我的问题是:在什么时候我怎么能告诉Spring不直接实例化产品而是解析它的一个子类?
(我可以很容易地在我的形式中使用鉴别器值,如下所示:
Product
)
答案 0 :(得分:1)
我最终不得不实施自己的Argument Resolver,正如其中一条评论指出的那样。
public class OrderResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(Order.class);
}
@Override
public Order resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory
) throws Exception {
Order order = new Order();
Pattern pattern = Pattern.compile("product\\[(\\d+)\\]\\.type");
for (String field : webRequest.getParameterMap().keySet()) {
Matcher matcher = pattern.matcher(field);
if (matcher.find()) {
String type = webRequest.getParameter(field);
Product product = null;
switch (type) {
case "typeA": product = new ProductTypeA(); break;
case "typeB": product = new ProductTypeB(); break;
case "typeC": product = new ProductTypeC(); break;
default: continue;
}
product.setId(webRequest.getParameter("product[" + matcher.group(1) + "].id"));
order.getProducts().add(product);
}
}
return order;
}