Wie bestimmt der Spring MVC den Typ eines bestimmten Anforderungsparameters?
Spring verwendet ServletRequestDataBinder, um seine Werte zu binden. Der Prozess kann wie folgt beschrieben werden
/**
* 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);
Hinter den Kulissen DataBinder Instanzen macht intern Verwendung eines BeanWrapperImpl Instanz, die die Werte des Befehlsobjekts für einzurichten verantwortlich ist. Mit getPropertyType Methode ruft es die Eigenschaft Typ
Wenn Sie den eingereichten Antrag oben sehen (natürlich durch ein Mock verwenden), Frühling
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person);
Clazz requiredType = beanWrapper.getPropertyType("name");
rufen und dann
beanWrapper.convertIfNecessary("Tom", requiredType, methodParam)
Wie bindet Spring MVC Container einen Anforderungsparameter, der ein Date darstellt?
Wenn Sie menschenfreundliche Darstellung von Daten, die spezielle Konvertierung benötigt, müssen Sie ein PropertyEditor Zum Beispiel registrieren, java.util.Date nicht weiß, was 13.09.2010, so dass Sie Frühling sagen
Frühling, wandeln diese menschenfreundliche Datum durch die folgende Property mit
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());
}
});
Wenn convertIfNecessary Methode aufrufen, Frühling für jeden Registere sieht d PropertyEditor, der sich um die Konvertierung des übergebenen Wertes kümmert. Zur Registrierung des Property, können Sie entweder
Frühling 3,0
@InitBinder
public void binder(WebDataBinder binder) {
// as shown above
}
alten Stil Frühling 2.x
@Override
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
// as shown above
}
Vielen Dank. –
Frühling 2.5.x hat auch einen @InitBinder: http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-initbinder – Rihards
Vielen Dank, weil dies scheint ein umfassende Antwort, aber für die Nicht-Experten würde es wirklich helfen, ein einfaches praktisches Beispiel zu enthalten. – Marquez