2015-03-23 2 views
4

У меня возникла проблема с привязкой формы к весне.Весна связывание абстрактные Объект

Учитывая это объект со следующей структурой:

- SiteContent 
|-List<Panel> boxList 

элемент панели выглядит следующим образом:

- Panel 
|- Collection<AbstractPanelElement> panelElements 

Коллекция с AbstractPanelElements является критической точкой, так как возможно, что AbstractPanelElements - Divider, Address или Icon.

Если я отправить форму, которая содержит несколько элементов этих типов я получаю следующее сообщение об ошибке:

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 

После исследований я обнаружил, что вполне возможно, что мы можем установить следующее (InitBinder) в контроллере:

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

Но это не решает проблему, это делает ситуацию, я думаю, что весна не может создать абстрактный класс.

Теперь мой вопрос, возможно ли, что я смогу решить эту проблему или нет пути?

+0

когда произошло это исключение? вызывает появление NullValueInNestedPathException, когда boxList.panelElements имеет значение null, и вы пытаетесь добавить к нему элементы. – vincent

+0

исключение будет выбрано после отправки формы. я отлаживаю его и признаю, что если весна попытается создать экземпляр элемента панели ('AbstractPanelElement') –

ответ

1

Вам необходимо предоставить свои собственные методы привязки, а затем создать правильные подтипы. 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; 
} 

Вы можете изменить это для обработки элементов списка, а также. В затылке я знаю, что есть PropertyEditors, которые вы можете реализовать, чтобы перейти от строкового представления к классу. Но у меня есть ограниченное время для исследования прямо сейчас.

Это может помочь вам: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-beans-conversion-customeditor-registration

Смежные вопросы