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