2009-02-05 6 views
6

Digamos que tengo el siguiente objeto de comando:primavera - unión a un objeto en lugar de una cadena o primitivo

class BreakfastSelectCommand{ 
    List<Breakfast> possibleBreakfasts; 
    Breakfast selectedBreakfast; 
} 

¿Cómo puedo tener la primavera despoblar "selectedBreakfast" con un desayuno en la lista?

estaba calculando que me gustaría hacer algo como esto en mi jsp:

<form:radiobuttons items="${possibleBreakfasts}" path="selectedBreakfast" /> 

pero esto no parece funcionar. ¿Algunas ideas?

gracias,

-Morgan

Respuesta

8

La clave de todo esto es la 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(); 
    } 
} 

nota que va a necesitar algunos nula comprobación, etc, pero se entiende la idea. En su controlador:

public BreakfastFooBarController extends SimpleFormController { 
    @Override 
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { 
     binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao)); 
    } 
} 

cosas a tener en cuenta:

  • de PropertyEditor no es seguro para subprocesos
  • si necesita granos de primavera, ya sea manualmente inyectarlos o definirlas en primavera como el alcance de prototipos y use la inyección de método en su controlador
  • tiro IllegalArgumentException si el parámetro entrante no es válido/no encontrado, spring lo convertirá en un error de enlace correctamente

esperanza esto ayuda.

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 tiene. Dicen que es una entidad, por ejemplo, como Person con una propiedad breakfast entonces el método formBackingObject() cargaría el objeto de la persona del PersonDao y retornarlo de acuerdo con el comando. La fase de enlace cambiaría la propiedad del desayuno según el valor seleccionado, de modo que el comando que llega al onSubmit tenga toda la propiedad del desayuno configurada.

Dependiendo de la implementación de los objetos DAO llamándolos dos veces o se intenta cargar la misma entidad dos veces en realidad no significa que obtendrá dos sentencias SQL que se ejecuta. Esto se aplica particularmente a Hibernate, donde se garantiza que le proporcione el mismo objeto que está en su sesión para un identificador dado, lo que se corre dejando que el intento de unión a cargar la selección Breakfast incluso a través de él no ha cambiado no debe dar lugar a ningún sobrecarga indebida.

+0

Gracias gid. En el punto de enlace, ¿no se habrá creado ya mi objeto de comando (una segunda vez)? Parece extraño que debería necesitar hacer otra solicitud de yourDao. – morgancodes

+0

@morgancodes ver arriba editar ...necesitaba un poco más de espacio –

+2

todo eso y ni un voto por turno ... –

Cuestiones relacionadas