Hi,
I have Problems with validating an List of SubObjects.
I have an Customer with a List of addresses (one to many-relationship):
Later on the user should be able to add as much address objects as wanted by javascript.
After sending my webform I want to check if the street property (e.g.) of each address but all my tries failed.
My question is how to do a nested validation of an List.
Thank you for all help and advices.
These are my classes:
Customer.java
Address.javaCode:@Entity @Table(name = "customer") public class Customer { private Integer id; private String name; public List<Address> addresses = new AutoPopulatingList(new AddressFactory()); @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) public List<Address> getAddresses() { return addresses; } public void setAddresses(List<Address> addresses) { this.addresses = addresses; } public void addAddress(Address address) { this.addresses.add(address); } }
CustomerValidator.javaCode:@Entity @Table(name = "address") public class Address implements IAddress,Serializable { /** * */ private static final long serialVersionUID = 1L; private Integer id; private String addressname; private String street; @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAddressname() { return addressname; } public void setAddressname(String addressname) { this.addressname = addressname; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } }
AddressValidator .javaCode:public class CustomerValidator implements Validator { public boolean supports(Class clazz) { return clazz.equals(Customer.class); } public void validate(Object obj, Errors errors) { Customer customer = (Customer) obj; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name", "Name muss gesetzt sein"); errors.setNestedPath("addresses"); try { for (Address address : customer.getAddresses()) { AddressValidator addressValidator = new AddressValidator(); ValidationUtils.invokeValidator(addressValidator, address, errors); } } finally { errors.popNestedPath(); } } }
CustomerCreateController.javaCode:public class AddressValidator implements Validator { public boolean supports(Class clazz) { return true;//clazz.equals(Address.class); } public void validate(Object obj, Errors errors) { Address address = (Address)obj; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "street", "required.street", "Strasse muss gesetzt sein"); } }
customerCreate.jspCode:@Controller public class CustomerCreateController extends CustomerBasicController { @Override protected Object formBackingObject(HttpServletRequest request) throws Exception { Customer customer = new Customer(); Address address = new Address(); address.setAddressname("Firmenaddresse"); customer.getAddresses().add(address); return customer; } protected void doSubmitAction(Object command) throws Exception { Customer customer = (Customer) command; customer = customerDao.save(customer); logger.debug("Customer saved"); } }
Code:<%@ include file="header.jspf"%> <form:form commandName="customer" method="POST" action="create.do"> <fieldset style="width: 500px;"> <legend>Kundendaten</legend> <spring:hasBindErrors name="customer"> <font color="red"> <c:forEach items="${errors.allErrors}" var="error"> <p><spring:message code="${error.code}" text="${error.defaultMessage}" /></p> </c:forEach> </font> </spring:hasBindErrors> <form:input path="name" /> <c:forEach items="${customer.addresses}" var="address" varStatus="itemRow"> <fieldset> <legend>${address.addressname}</legend> <label for="addresses[${itemRow.index}].street">Strasse <br /> <input type="text" name="addresses[${itemRow.index}].street" id="addresses[${itemRow.index}].street" value="${address.street}" /> </label> </fieldset> </c:forEach> </fieldset> <br /> <input type="submit" value="Kunde anlegen" /> </form:form> <%@ include file="footer.jspf"%>
Thank you.


Reply With Quote
