2015-07-02 3 views
0

У меня есть следующие бобы:Весна привязки и поля формы именования

class User { 
    private List<Address> addresses; 

    // ... getter and setter for addresses follows 
} 

class Address { 
    private String street, city; 

    // ... getters and setters follows 
} 

Это контроллер

@RequestMapping(value = { "/doSomething" }) 
public String doSomething(@ModelAttribute User user, BindingResult result, Model model) { 
    // ... 
} 

А форма может быть что-то вроде

<form> 
    <input type="text" name="addresses[].street" /> 
    <input type="text" name="addresses[].city" /> 
    ... 
</form> 

Но я получаю следующая погрешность

Request processing failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'addresses[]' of bean class [User]: Invalid index in property path 'addresses[]'; nested exception is java.lang.NumberFormatException: For input string: "" 
java.lang.NumberFormatException: For input string: "" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_31] 
at java.lang.Integer.parseInt(Integer.java:592) ~[na:1.8.0_31] 
at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_31] 
at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:989) ~[spring-beans-4.1.2.RELEASE.jar:4.1.2.RELEASE] 

Как я могу назвать поля в форме, чтобы Spring могла выполнить привязку?

+0

попробуйте добавить в контроллер метод: model.addAttribute ("retrievedAddresses", user.addresses); а затем в форме просто выполните: name = "retrievedAddresses [0]" – smoggers

+0

вы используете ngRepeat для прокрутки этих адресов? например '

.... input fields ...
'? Если это так, вам нужно использовать address.street и т. Д. Ошибка, о которой я думаю, состоит в том, что она не может преобразовать [""] в [число] и, следовательно, не может найти какой элемент из этого массива, к которому он должен получить доступ. – Stef

ответ

0

У меня есть проблема. Проблема заключается в том, что свойство не имеет индекса. Spring может связывать несколько свойств (коллекции, списки, массивы) для запроса параметров, но имена должны содержать индекс.

Таким образом, форма должна быть

<form> 
    <input type="text" name="addresses[0].street" /> 
    <input type="text" name="addresses[0].city" /> 

    <input type="text" name="addresses[1].street" /> 
    <input type="text" name="addresses[1].city" /> 
    ... 
</form> 

Вместо 0, 1 ... Вы можете использовать ${iterationStatus.index} в Thymeleaf (на стороне сервера) или {{$index}} в угловыми (со стороны клиента).

0

Ошибка, о которой я думаю, состоит в том, что она не может преобразовать [""] в [число] и, следовательно, не может найти какой элемент из этого массива, к которому он должен получить доступ.

Для коллекций вы либо используете ngRepeat, либо можете использовать явные индексы. В большинстве случаев вы будете хотеть петлю, так вот пример того, что:

<form ng-repeat="address in user.addresses"> 
    <input type="text" ng-model="address.street" /> 
    <input type="text" ng-model="address.city" /> 
    ... 
</form> 

Обратите внимание, что это работает, если вы отправите форму, используя угловые (таким образом, вместо того, чтобы позволить стандартный HTML представить, вы представите Объект scope, который Angular модифицирует из-за отображения ng-модели.

+0

Таким образом, параметр не передается, поэтому Spring не будет привязываться. –

+0

Если вы отправляете форму из Углового, там должно быть обязательство. Если вы используете стандартную отправку HTML, я не уверен, как вы это сделаете. – Stef