gpt4 book ai didi

java - Spring绑定(bind)抽象对象

转载 作者:搜寻专家 更新时间:2023-11-01 03:36:48 25 4
gpt4 key购买 nike

我对 Spring 中的表单数据绑定(bind)有疑问。

Given 是一个具有以下结构的对象:

- SiteContent
|-List<Panel> boxList

面板元素如下所示:

- Panel
|- Collection<AbstractPanelElement> panelElements

包含AbstractPanelElements的集合是关键点,因为AbstractPanelElements可能是一个DividerAddress图标

如果我提交包含这些类型的多个元素的表单,我会收到以下错误:

org.springframework.beans.InvalidPropertyException: 
Invalid property 'boxList[0].panelElements[0]' of bean class [com.panel.SiteContent]:
Illegal attempt to get property 'panelElements' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException:
Invalid property 'boxList[0].panelElements' of bean class [com.panel.SiteContent]:
Could not instantiate property type [com.panel.AbstractPanelElement] to auto-grow nested property path: java.lang.InstantiationException

经过研究,我发现我们可以在 Controller 中设置以下(InitBinder):

@InitBinder
public void initBinder(WebDataBinder binder){
binder.setAutoGrowNestedPaths(false);
}

但这并没有解决问题,它有道理,我认为spring不能实例化一个抽象类。

现在我的问题是,我可以解决这个问题还是没有办法?

最佳答案

您需要提供自己的绑定(bind)方法,然后创建正确的子类型。否则 Spring 不会知道应该为哪个元素实例化哪个子类型。

一个例子是这样的:

@ModelAttribute("item")
public Item getItem(final HttpServletRequest request){
String type = request.getParameter("type");
if (type!=null){
if (type.equals(TYPE1.class.getSimpleName())){
return new TYPE1();
}
if (type.equals(TYPE2.class.getSimpleName())){
return new TYPE2();
}
throw new RuntimeException("OH NOES! Type unknown!");
}
return null;
}

您也可以修改它来处理列表项。在我的脑海中,我知道您可以实现 PropertyEditor 以从字符串表示形式到类。但我现在研究的时间有限。

这可能对您有帮助: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-beans-conversion-customeditor-registration

关于java - Spring绑定(bind)抽象对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com