2011-09-12 11 views
5

Possiedo un controller con un metodo che gestisce i dati GET in arrivo, memorizza alcuni elementi nello model e quindi reindirizza a un'altra pagina che gestisce questi oggetti.Come posso ottenere un oggetto dal modello nel controller con Spring MVC 3?

Non riesco a trovare alcun buon metodo per ottenere l'oggetto archiviato nel primo metodo fuori dal modello da utilizzare nel secondo metodo. Come posso fare questo?

Ecco la parte superiore del controller:

@Controller 
@RequestMapping("/reviews") 
@SessionAttributes({"review", "externalReview"}) 
public class ReviewController { 
    // [SNIP] 
} 

Ecco il codice che aggiunge gli oggetti che sto cercando per il modello:

@RequestMapping(value="/new", params="UName", method=RequestMethod.GET) 
public String newFormFromExternal(@ModelAttribute("externalReview") ExternalReview externalReview, Model model) throws IncompleteExternalException { 
    // Convert the inbound external 
    Review fromExternal = ExternalReviewUtil.reviewFromExternalReview(externalReview, externalDAO); 

    // Add the externalReview to the session so we can look to see if we got a reviewee on the way in 
    model.addAttribute("externalReview", externalReview); 

    model.addAttribute("review", fromExternal); 

    return "redirect:/reviews/newFromExternal"; 
} 

risposta

2

Siete fortunati.

Se si sta usando o ha possibilità di aggiornare al recente rilasciato Primavera 3.1, si può fare uso delle nuove con ambito Flash variabili.

http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/mvc.html#mvc-flash-attributes

Se non è possibile utilizzare 3.1, probabilmente si può implementare la soluzione da soli. In sostanza, si desidera acquisire l'oggetto del modello richiesto per essere presente nel reindirizzamento, inserire la sessione e rimuoverlo una volta recuperato per evitare il gonfiore della sessione.

1

Attualmente, sto solo ottenendo un Map di il modello, ottenendo l'oggetto che desidero tramite la sua chiave (il nome String) e quindi trasmettendolo all'oggetto è realmente (anziché solo Object).

Ecco il codice:

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(Model model) { 
    // Get the review from the model 
    Review review = (Review) model.asMap().get("review"); 

    /*** Do stuff with the review from the model ****/ 

    return "reviews/newFromPacs"; 
} 

In questo modo funziona, ma sembra hacky e goffo. È davvero l'unico modo?

+0

'review' è dichiarato in' @ SessionAttributes', giusto? – axtavt

+0

@axtavt - Sì, ho modificato la domanda per mostrare la definizione della classe del controller. – cdeszaq

1

Una possibile soluzione è quella di utilizzare @ModelAttribute, anche se è abbastanza brutto da quando è necessario disattivare l'associazione dati per tale attributo (per la sicurezza):

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(@ModelAttribute Review review) { 
    ... 
} 

@InitBinder("review") 
public void disableReviewBinding(WebDataBinder b) { 
    b.setAllowedFields(); 
} 
+0

Sfortunatamente, disabilitare l'associazione dati su quell'attributo diventerebbe davvero brutto perché ho bisogno che l'utente compili dati mancanti (questo è ciò che il 2 ° metodo tratta), quindi il binding corrente su un metodo 'POST' successivo è il flusso corrente. Tuttavia, questo è più pulito (su un certo livello) di quello che attualmente ho. – cdeszaq

Problemi correlati