Validierung von mehreren Objekten/Commands in einem Controller (Spring MVC)

daNny

Aktives Mitglied
Hallo Ihr!

Ich arbeite mich gerade neu in die Thematik Spring (Web MVC) ein, und sitze an einer Stelle, bei der ich nicht genau weiß, wie ich dort am geschicktesten Arbeiten kann.

Ich habe die Entitäten Customer und Address. Jeder Kunde besitzt ein einzelnes Address-Objekt, welches seine Anschrift darstellen soll. Nun soll der Benutzer des Systems die Möglichkeit haben, einen neuen Kunden mittels eines Formulares einzugeben, sprich Name + Anschrift. Hier erstmal die Entitäten

Java:
public class Customer implements Serializable {

    private static final long serialVersionUID = -2931800946076947354L;
	
    private Long id;
	
    @NotEmpty
    private String name;
	
    private Address address;
    
    /* Getter und Setter */

}

Java:
public class Address implements Serializable {

    private static final long serialVersionUID = -922853019764803793L;
	
    private Long id;
	
    @NotEmpty
    private String street;
    @NotEmpty
    private String streetNumber;
    @NotEmpty
    private String zip;
    @NotEmpty
    private String city;

    /* Getter und Setter */
}

Das Formular sollte nun in etwa so aussehen

Code:
<spring:url value="/customer" var="form_url" />
<form:form method="post" modelAttribute="customer" action="${form_url}">
<table>
	<tr>
		<th>Name: </th>
		<td><form:input path="name" /><form:errors path="name" cssClass="error" /></td>
	</tr>
	<tr>
		<th>Strasse: </th>
		<td><form:input path="address.street" /><form:errors path="address.street" cssClass="error" /></td>
	</tr>
        <tr>
		<th>Hausnummer: </th>
		<td><form:input path="address.streetNumber" /><form:errors path="address.streetNumber" cssClass="error" /></td>
	</tr>
        <tr>
		<th>PLZ: </th>
		<td><form:input path="address.zip" /><form:errors path="address.zip" cssClass="error" /></td>
	</tr>
        <tr>
		<th>Stadt: </th>
		<td><form:input path="address.city" /><form:errors path="address.city" cssClass="error" /></td>
	</tr>
	<tr>
		<td colspan="2"><input type="submit" value="Speichern" /></td>
	</tr>
</table>
</form:form>

Mein CustomerController sieht nun bisher so aus:

Java:
@Controller
public class CustomerController {
	
    private Logger logger = org.slf4j.LoggerFactory.getLogger(IndexController.class);
	
    @RequestMapping(value="/customer", method=RequestMethod.POST)
    public String create(@ModelAttribute("customer") @Valid Customer customer, BindingResult result, ModelMap modelMap) {
        if (customer == null) throw new IllegalArgumentException("Property needed");
        if (result.hasErrors()) {
            modelMap.addAttribute("customer", customer);
            return "customer/create";
        }

        logger.info("Hier wird der Kunde nun in die DB geschrieben");
		
        return "redirect:/customer/" + customer.getId();
	}
	
	@RequestMapping(value="/customer/form", method=RequestMethod.GET)
	public String createForm(ModelMap modelMap) {
		modelMap.addAttribute("customer", new Customer());
		return "customer/create";
	}

}

Allerdings wird bei der Validierung nur die Customer-Entität überprüft. Die Annotationen der Address-Entität dagegen nicht.
Ich weiß, dass man mehrere @ModelAttribute Parameter in der entsprechenden Methode verwenden kann, allerdings nicht, wie das entsprechende JSP-Formular aussehen würde.

Kann mir jemand sagen, wie ich sowas am besten validiere, also Felder von Formularen, die in wirklichkeit zu mehreren Entitäten gehören?

Ich weiß, dass ich die Adress-Felder auch zum Customer schieben könnte, aber darum geht es mir ja nicht unbedingt ;)

Danköö
 

Neue Themen


Oben