Comment le Spring MVC déterminer le type d'un paramètre de la requête ?
Le printemps fait usage de ServletRequestDataBinder de lier ses valeurs. Le processus peut être décrit comme suit
/**
* 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);
En coulisses, DataBinder instances en interne permet l'utilisation d'un BeanWrapperImpl instance qui est chargée de définir les valeurs de l'objet de commande. Avec getPropertyType méthode, il récupère le type de propriété
Si vous voyez la demande présentée ci-dessus (bien sûr, en utilisant une maquette), le Printemps sera appel
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person);
Clazz requiredType = beanWrapper.getPropertyType("name");
Et Puis
beanWrapper.convertIfNecessary("Tom", requiredType, methodParam)
Comment Spring MVC conteneur de lier un paramètre de la requête qui représente une Date ?
Si vous avez de l'homme-friendly représentation de données qui ont besoin d'une conversion, vous devez vous inscrire à un PropertyEditor Par exemple, java.util.La Date ne sais pas ce que 13/09/2010 est, alors dites-le Printemps
Printemps, convertir cet homme-friendly date à l'aide de la 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());
}
});
Lors de l'appel de convertIfNecessary méthode, le Printemps semble pour tout régime enregistré d'PropertyEditor qui prend en charge la conversion de la valeur soumise. Pour inscrire votre PropertyEditor, vous pouvez soit
Spring 3.0
@InitBinder
public void binder(WebDataBinder binder) {
// as shown above
}
Vieux style de Printemps 2.x
@Override
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
// as shown above
}