2012-02-29 12 views
6

Voglio creare un modulo di aggiornamento per un bean X. Questo bean indica che ha campi A, B, C, D. Nel mio modulo I voglio aggiornare solo i campi A, B e lasciare intatti C e D. C'è un modo per legare il bean X al modulo di aggiornamento con i soli campi A e B, in modo che quando invio il modulo C e D non vengano modificati?Spring MVC: come non perdere i valori dei campi quando si associa a un modulo parzialmente

So che posso aggiungere campi nascosti per C e D ma se questi non sono campi primitivi, sono altri bean o raccolte.

Conosco un'altra soluzione per creare un XUpdateBean che avrà solo i campi A e B e dopo il modulo di invio copiare i campi da XUpdateBean al mio X bean.

C'è un altro modo per questo aggiornamento migliore in Spring 3 MVC?

+0

Usa Flash: http://stackoverflow.com/questions/11763779/how-to-read-flash-attributes-after-redirection-in-spring-mvc-3-1/31017551#31017551 – logixplayer

risposta

3

Si potrebbe avere un oggetto comando/form-barking-Bean che contiene solo i campi necessari.

Nel controller è necessario caricare il bean X e aggiornare i suoi campi con quello di commandObject.

Si può anche pensare di non avere una classe extra per il comandoOggetto, invece di usare la classe BeanX. Ma ovviamente occorrono due istanze di BeanX, una per commandObject e una per bean x.

0

Spiacente, non so SpringMVC, quindi la mia risposta potrebbe essere errata.

Con un'altra struttura chiamata Stripes, di solito "idratiamo" i dati prima del binding. Questo significa che prima carichi il bean dal db, e solo allora vincerai il valore A e B! Ma ha ancora valori originali C e D poiché il bean proviene dal DB (di solito un'entità JPA). Quindi non hai bisogno di campi C e D nascosti!

Sembra possibile con SpringMVC: Spring MVC 3.0: How do I bind to a persistent object

noti che si potrebbe anche caricare legano ad un "fagiolo non-DB", come effettivamente fare, (in modo da avere i campi C e D vuoto credo che se non usi campi nascosti). Quindi puoi semplicemente caricare il bean che vuoi modificare dal DB, e fare un'unione tra il bean binded e il bean db, dei campi che vuoi (qui, unirai solo A e B in modo che il C e I campi D nel bean DB non saranno modificati)

Qui puoi trovare informazioni interessanti sull'associazione dati. Per me, in alcuni casi difficili, legandosi direttamente agli oggetti DB può essere pericoloso: How to use a binding framework efficiently

0

Il modo corretto, nella mia mente, soprattutto quando si tratta di Optimistic controllo della concorrenza (@Version) è quello di memorizzare l'attributo di modello in sessione temporanea . attribuisce

@Controller 
@SessionAttributes("x") 
public class MyController { 

    @Autowired 
    private XRepository xRepository; 

    @InitBinder 
    void initBinder(WebDataBinder binder) { 
     binder.setDisallowedFields("id", "c", "d"); 
    } 

    @RequestMapping("/x/{id}") 
    String myForm(@PathVariable("id") long id, Model model) { 

     X x = xRepository.findOne(id); 
     model.addAttribute("x", x); 

     return "x-edit"; 
    } 

    @RequestMapping(value="/x/{id}", method= RequestMethod.POST) 
    String save(@PathVariable("id") long id, @ModelAttribute X x, SessionStatus sessionStatus) { 

     xRepository.save(x); 

     sessionStatus.setComplete(); 
     return "x-edit"; 
    } 
} 
Problemi correlati