1

我正在尝试使用 AutoPopulatingList 创建一个动态填充的列表。我还有一个表单对象,如下面的代码所示:

public class CDNoteForm{

    private AbstractCDNote cdnote;
    private List<? extends AbstractInvoiceItem> invoiceItemList ;


    public CDNoteForm() {
        super();
    }
    public CDNoteForm(String type){
        super();
        if(type.equals("cdnote")){
            this.invoiceItemList =  new AutoPopulatingList<CDNoteItem>(CDNoteItem.class);
        }
        else if(type.equals("vendorcdnote")) {          
            this.invoiceItemList =  new AutoPopulatingList<VendorCDNoteItem>(VendorCDNoteItem.class);
        }

    }

    public AbstractCDNote getCdnote() {
        return cdnote;
    }
    public void setCdnote(AbstractCDNote cdnote) {
        this.cdnote = cdnote;
    }
    public List<? extends AbstractInvoiceItem> getInvoiceItemList() {
        return invoiceItemList;
    }
    public void setInvoiceItemList(List<? extends AbstractInvoiceItem> invoiceItemList) {
        this.invoiceItemList = invoiceItemList;
    }
}

表单对象在我的控制器中的一个方法中声明,如下所示。

@RequestMapping(value ="/cdnote/create"  , method = RequestMethod.GET)
    public String getCreateCDNotePage(Model model){

    CDNoteForm cdnoteForm = new CDNoteForm("cdnote");
    model.addAttribute("CDNoteForm" , cdnoteForm);
    return "AddCDNote";
}

像这样在 jsp 中引用了“invoiceItemList”

<form:input type="text" id="Quantity0"  path="invoiceItemList[0].quantity" class="form-control"></form:input>                       

“CDNoteItem”和“VendorCDNoteItem”这两个类扩展了抽象类“AbstractInvoiceItem”。现在我在编译时没有收到任何错误,但是当我尝试运行它并访问该页面时,我在控制台上收到以下错误。

SEVERE: Servlet.service() for servlet [SpringGST] in context with path [/SpringGST] threw exception [org.springframework.beans.InvalidPropertyException: Invalid property 'invoiceItemList[0]' of bean class [com.gst.FormObjects.CDNoteForm]: Illegal attempt to get property 'invoiceItemList' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'invoiceItemList' of bean class [com.gst.FormObjects.CDNoteForm]: Could not instantiate property type [com.gst.models.AbstractInvoiceItem] to auto-grow nested property path: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.gst.models.AbstractInvoiceItem]: Is it an abstract class?; nested exception is java.lang.InstantiationException] with root cause
org.springframework.beans.NullValueInNestedPathException: Invalid property 'invoiceItemList' of bean class [com.gst.FormObjects.CDNoteForm]: Could not instantiate property type [com.gst.models.AbstractInvoiceItem] to auto-grow nested property path: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.gst.models.AbstractInvoiceItem]: Is it an abstract class?; nested exception is java.lang.InstantiationException

我不明白为什么在使用对其子类的自动填充列表的引用初始化“invoiceItemlist”时它试图实例化抽象类“AbstractInvoiceItem”

4

2 回答 2

0

您可以使用 invoiceItemList.get(0) 代替 invoiceItemList[0] 并尝试

于 2017-12-11T09:29:13.490 回答
0

由于 invoiceItemList 是私有的,因此您会遇到异常。您需要将其公开(不推荐),或者您需要使用 getter 和 setter 来访问它。

private List<? extends AbstractInvoiceItem> invoiceItemList ;

public List<? extends AbstractInvoiceItem> getInvoiceItemList(){
  return invoiceItemList;
}
public setInvoiceItemList(List<? extends AbstractInvoiceItem> list){
invoiceItemList= list;
}

现在您可以像这样访问:

<form:input type="text" id="Quantity0"  
path="cdnoteForm.getInvoiceItemList().get(0).quantity" class="form-control">
</form:input>        
于 2017-12-11T11:01:33.003 回答