multiple - spring mvc formulario ejemplo
Primavera: uniĆ³n a un objeto en lugar de una cadena o primitivo (1)
Digamos que tengo el siguiente objeto de comando:
class BreakfastSelectCommand{
List<Breakfast> possibleBreakfasts;
Breakfast selectedBreakfast;
}
¿Cómo puedo tener la primavera para llenar "selectedBreakfast" con un desayuno de la lista?
Pensaba que haría algo como esto en mi jsp:
<form:radiobuttons items="${possibleBreakfasts}" path="selectedBreakfast" />
Pero esto no parece funcionar. ¿Algunas ideas?
Gracias,
-Morgan
La clave de todo esto es el PropertyEditor.
Debe definir un PropertyEditor para su clase de desayuno y luego configurar ServletDataBinder usando registerCustomEditor en el método initBinder de su controlador.
ejemplo:
public class BreakfastPropertyEditor extends PropertyEditorSupport{
public void setAsText(String incomming){
Breakfast b = yourDao.findById( Integer.parseInt(incomming));
setValue(b);
}
public String getAsText(){
return ((Breakfast)getValue()).getId();
}
}
tenga en cuenta que necesitará una comprobación nula, etc., pero se entiende la idea. En tu controlador:
public BreakfastFooBarController extends SimpleFormController {
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao));
}
}
Cosas de las que hay que estar atento:
- PropertyEditor no es seguro para subprocesos
- si necesita frijoles primavera, bien inyéctelos manualmente o defínalos en primavera como alcance del prototipo y use la inyección del método en su controlador
- arrojar IllegalArgumentException si el parámetro de entrada no es válido / no encontrado, Spring lo convertirá en un error de encuadernación correctamente
espero que esto ayude.
Editar (en respuesta al comentario): Parece un poco extraño en el ejemplo dado porque BreakfastSelectCommand no se ve como una entidad, no estoy seguro de cuál es el escenario real que tienes. Digamos que es una entidad, por ejemplo, como Person
con una propiedad de breakfast
, entonces el método formBackingObject()
cargaría el objeto Person desde el PersonDao
y lo devolvería como el comando. La fase de enlace cambiaría la propiedad del desayuno según el valor seleccionado, de modo que el comando que llega a onSubmit
tenga toda la propiedad del desayuno configurada.
Dependiendo de la implementación de sus objetos DAO llamándolos dos veces o intentando cargar la misma entidad dos veces, en realidad no significa que se ejecutarán dos sentencias SQL. Esto se aplica particularmente a Hibernate, donde garantiza que devolverá el mismo objeto que está en su sesión para un identificador dado, por lo tanto, ejecutar dejando que el intento de vinculación para cargar la selección de Breakfast
incluso a través de él no haya cambiado no debería dar como resultado sobrecarga indebida.