¿Cómo determina Spring MVC el tipo de un parámetro de solicitud dado?
Spring utiliza ServletRequestDataBinder para vincular sus valores. El proceso puede ser descrito de la siguiente manera
/**
* Bundled Mock request
*/
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("name", "Tom");
request.addParameter("age", "25");
/**
* Spring create a new command object before processing the request
*
* By calling <COMMAND_CLASS>.class.newInstance();
*/
Person person = new Person();
...
/**
* And Then with a ServletRequestDataBinder, it bind the submitted values
*
* It makes use of Java reflection To bind its values
*/
ServletRequestDataBinder binder = ServletRequestDataBinder(person);
binder.bind(request);
Detrás de las escenas, DataBinder casos internamente hace uso de una instancia BeanWrapperImpl que es responsable de establecer los valores del objeto de comando. Con getPropertyType método, se recupera el tipo de propiedad
Si ve la solicitud presentada anteriormente (por supuesto, mediante el uso de una maqueta), Primavera llamará
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person);
Clazz requiredType = beanWrapper.getPropertyType("name");
Y Luego
beanWrapper.convertIfNecessary("Tom", requiredType, methodParam)
¿Cómo se vincula el contenedor Spring MVC a un parámetro de solicitud que representa una Fecha?
Si tiene representación humana de usar los datos que necesita la conversión especial, debe registrar un PropertyEditor Por ejemplo, java.util.Date no sabe lo que es el 13/09/2010, por lo que dice la primavera
primavera, convertir esta fecha con un amigable con el siguiente PropertyEditor
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
public void setAsText(String value) {
try {
setValue(new SimpleDateFormat("dd/MM/yyyy").parse(value));
} catch(ParseException e) {
setValue(null);
}
}
public String getAsText() {
return new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue());
}
});
al llamar método convertIfNecessary, primavera busca cualquier registere d PropertyEditor que se encarga de convertir el valor enviado. Para registrar su PropertyEditor, puede
primavera 3,0
@InitBinder
public void binder(WebDataBinder binder) {
// as shown above
}
-viejo estilo 2.x primavera
@Override
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
// as shown above
}
Muchas gracias. –
Spring 2.5.x también tiene un @InitBinder: http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-initbinder – Rihards
Gracias porque esto parece ser un una respuesta completa pero para los no expertos sería realmente útil incluir un ejemplo práctico simple. – Marquez