2012-02-29 17 views
6

Quiero hacer un formulario de actualización para un bean X. Este bean digamos que tiene los campos A, B, C, D. En mi forma I quiero actualizar solo los campos A, B y dejar C y D intactos. ¿Hay alguna manera de vincular bean X al formulario de actualización con solo los campos A y B, de modo que cuando envíe el formulario C y D no se modifiquen?Spring MVC - cómo no perder valores de campo cuando se vincula a un formulario parcialmente

Sé que puedo agregar campos ocultos para C y D pero que si estos no son campos primitivos, son otros beans o colecciones.

Sé que otra solución sería crear un XUpdateBean que tenga solo los campos A y B y después de enviar el formulario copie los campos de XUpdateBean a mi bean X.

¿Hay alguna otra manera de mejorar esta actualización en Spring 3 MVC?

+0

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

Respuesta

3

Puede tener un comando-Object/form-barking-Bean que contiene solo los campos que necesita.

En el controlador tiene que cargar el bean X, y necesita actualizar sus campos con el del commandObject.

También puede pensar en no tener una clase adicional para el commandObject, en su lugar use la clase BeanX. Pero, por supuesto, necesita dos instancias de BeanX, una para el commandObject y otra para bean x.

0

Lo siento, no conozco SpringMVC, por lo que mi respuesta puede ser incorrecta.

Con otro marco vinculante llamado Stripes, generalmente "hidratamos" los datos antes de la vinculación. Esto significa que primero carga el bean desde la base de datos, y solo entonces le vinculará el valor A y B. Pero todavía tiene valores originales C y D, ya que el bean proviene de la base de datos (generalmente una entidad JPA). ¡Por lo tanto, no necesita campos C y D ocultos!

Parece posible con SpringMVC: Spring MVC 3.0: How do I bind to a persistent object

Tenga en cuenta que también se puede cargar unen a un "grano de no-DB" como si de hecho lo hace, (por lo que tendrá campos C y D vacía yo supongo que si no usas campos ocultos). Luego, simplemente puede cargar el bean que desea modificar desde el DB, y hacer una fusión entre el bean encuadernado, y el bean db, de los campos que desea (aquí, fusionará solo A y B para que el C y Los campos D en el bean DB no se modificarán)

Aquí puede encontrar algunas cosas interesantes sobre el enlace de datos. Para mí, en algunos casos difíciles, uniéndose directamente a los objetos de base de datos puede ser peligroso: How to use a binding framework efficiently

0

La forma correcta, en mi mente, especialmente cuando se trata de control de concurrencia optimista (@Version) es almacenar el atributo modelo en sesión temporalmente . atribuye

@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"; 
    } 
} 
Cuestiones relacionadas