2010-09-14 5 views
40

Para parámetros de solicitud que representan valores de cadena, número y booleano, el contenedor Spring MVC puede vincularlos a propiedades tipeadas de fábrica.Spring MVC - Enlace de un campo de fecha

¿Cómo hace para que el contenedor Spring MVC enlace un parámetro de solicitud que representa una Fecha?

Hablando de eso, ¿cómo determina Spring MVC el tipo de un parámetro de solicitud dado?

Gracias!

Respuesta

62

¿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 
} 
+0

Muchas gracias. –

+1

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

+2

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

30

En complemento a la respuesta muy completa de Arthur: en el caso de un simple Fecha campo, no tiene que implementar todo el PropertyEditor. Solo puede usar un CustomDateEditor al cual simplemente pase el formato de fecha para usar:

//put this in your Controller 
//(if you have a superclass for your controllers 
//and want to use the same date format throughout the app, put it there) 
@InitBinder 
private void dateBinder(WebDataBinder binder) { 
      //The date format to parse or output your dates 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
      //Create a new CustomDateEditor 
    CustomDateEditor editor = new CustomDateEditor(dateFormat, true); 
      //Register it as custom editor for the Date type 
    binder.registerCustomEditor(Date.class, editor); 
} 
+0

Agregar algunos comentarios a su código ayudará al OP a comprender su propuesta de respuesta. Verifique esta [pregunta de metaSO] (http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question) y [Jon Skeet: Coding Blog] (http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpfully.aspx) sobre cómo dar una respuesta correcta. – Yaroslav

Cuestiones relacionadas