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.
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
@morgancodes ver arriba editar ...necesitaba un poco más de espacio –
todo eso y ni un voto por turno ... –