Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-从模型到某个子类的解析_Java_Spring_Spring Mvc - Fatal编程技术网

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

Java Spring-从模型到某个子类的解析,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有一个创建订单的表单。订单具有产品的列表 post数据可能类似于: client_id=123 product[0].id=1 product[1].id=10 product[2].id=14 问题是,在我的控制器中,我用 @ModelAttribute("order") Order newOrder 我猜这就是Spring实例化Order对象,设置其属性,然后尝试初始化列表并添加所有三种产品的时候 当Product是一个抽象类时,这就失败了,就像我的情况一样,实际上它有3个具体的子类。

我有一个创建订单的表单。
订单
具有
产品的
列表

post数据可能类似于:

client_id=123
product[0].id=1
product[1].id=10
product[2].id=14
问题是,在我的控制器中,我用

@ModelAttribute("order") Order newOrder
我猜这就是Spring实例化Order对象,设置其属性,然后尝试初始化列表并添加所有三种产品的时候

Product
是一个抽象类时,这就失败了,就像我的情况一样,实际上它有3个具体的子类。所以,我的问题是:在什么时候,如何让Spring不直接实例化产品,而是解析为它的一个子类

(我可以很容易地在我的表格中获得鉴别器值,如下所示:

product[0].id=1
product[0].type=typeA
product[1].id=10
product[1].type=typeB
product[2].id=14
product[2].type=typeA

)

正如其中一条评论所指出的,我最终不得不实现自己的参数解析器

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;

}

我认为对你们来说唯一的方法就是实现你们自己的抽象类。这是好的,谢谢。我发现了。我正在实施它,并将很快作为答案发布。