Ho un controller con un metodo GET scritta in questo modo:Spring Web MVC, @ModelAttribute e @RequestParam insieme
@Controller
public class ThingController {
@RequestMapping(value = "/Thing.html", method = RequestMethod.GET)
public String editThing(@RequestParam("thingId") String thingId, @ModelAttribute ThingBean thing, BindingResult result) {
thing = <some service call using thingId>
logger.debug("The thing to edit is {}", thingBean);
return "thing/edit";
}
}
Il fagiolo è corretto (getter e setter), la chiamata di servizio restituisce il ThingBean corretta con il thingId e la mia pagina JSP su thing/edit.jsp si presenta.
Il JSP è:
<html>
<body>
<h1 id="title" class="title">Edit Thing</h1>
<form:form id="thing" modelAttribute="thing">
<form:input path="subject" id="subject" tabindex="1" />
<form:textarea path="message" />
</form:form>
</body>
</html>
Eppure, JSP visualizza i valori vuoti per l'oggetto e il messaggio. Sì, ci sono getter/setter su queste proprietà.
Ho un controller molto simile che funziona bene, tranne che non esiste @RequestParam nella firma del metodo GET-mappato lì.
Non ho visto da nessuna parte nei documenti WebMVC di Spring che dice che non posso farlo - perché non funziona? Perché l'oggetto ModelAttribute aggiornato non è associato al modulo JSP?
EDIT: molti molti luoghi diversi
Questo controller, e questo stesso modello per le chiamate GET ha funzionato - la variabile annotato con @ModelAttribute è riempito in con il metodo quindi disponibile per la pagina JSP da visualizzare. Perché, aggiungendo un'annotazione @RequestParam, si ferma?
@RequestMapping(value = "/Things.html", method = RequestMethod.GET)
public String getThings(@ModelAttribute ThingForm thingForm, BindingResult result) {
try {
// need to get list of Things
List<Thing> Things = <service call that gets list of Things>;
thingForm.setThings(Things);
logger.debug("Things are {}", Things);
}
catch (ResourceNotFoundException e) {
return "error";
}
logger.debug("Thing list loading - end");
// Go to jsp
return "thing/list";
}
ci mostri il vostro altro controller.and Cosa M.Deinum ha detto è corretto. – beinghuman
Domanda modificata per aggiungere un controesempio. –
Come ho menzionato nella mia risposta nel controller che hai postato, stai ** riassegnando ** una variabile (l'argomento del metodo) NON stai chancing l'oggetto che passi nel metodo. Nel controller si dice che funziona ** si aggiunge ** qualcosa a un oggetto che funziona come un oggetto modello. Fondamentalmente è abbastanza diverso. –