Как дать ссылку на AutopopulationList<ChildClass> на List<AbstractBaseClass> весной?
Я пытаюсь создать динамически заполненный список, используя AutoPopulationList. У меня также есть объект формы, как показано в коде ниже:
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";
}
"InvoiceItemList" упоминается в JSP, как это
<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
Я не понимаю, почему он пытается создать экземпляр абстрактного класса "AbstractInvoiceItem", когда "invoiceItemlist" был инициализирован со ссылкой на список автозаполнения его дочернего класса
2 ответа
Можете ли вы использовать invoiceItemList.get(0) вместо invoiceItemList[0] и попробовать
Поскольку invoiceItemList является закрытым, вы получаете исключение. Вам нужно либо сделать его общедоступным (не рекомендуется), либо вам нужно использовать методы получения и установки для доступа к нему.
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>