Spring - 从模型解析到某个子类

时间:2016-06-02 12:51:53

标签: java spring spring-mvc

我有一张创建订单的表单。 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

1 个答案:

答案 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;

}