Как Spring MVC определяет тип заданного параметра запроса?
Spring использует ServletRequestDataBinder для привязки его значений. Процесс можно описать следующим образом
/**
* 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);
За кулисами экземпляры DataBinder внутренне используют экземпляр BeanWrapperImpl , который отвечает за установку значений объекта команды. С помощью метода getPropertyType он получает тип свойства
Если вы видите отправленный запрос выше (конечно, с помощью макета), Spring позвонит
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person);
Clazz requiredType = beanWrapper.getPropertyType("name");
А потом
beanWrapper.convertIfNecessary("Tom", requiredType, methodParam)
Как контейнер Spring MVC связывает параметр запроса, представляющий дату?
Если у вас есть удобное для человека представление данных, которое требует специального преобразования, вы должны зарегистрировать PropertyEditor Например, java.util.Date не знает, что такое 13/09/2010, поэтому вы говорите Весна
Spring, конвертируйте эту удобную для человека дату, используя следующий 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());
}
});
При вызове метода convertIfNeeded Spring ищет любой зарегистрированный PropertyEditor, который заботится о преобразовании переданного значения. Чтобы зарегистрировать свой PropertyEditor, вы можете либо
Пружина 3,0
@InitBinder
public void binder(WebDataBinder binder) {
// as shown above
}
Старый стиль Spring 2.x
@Override
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
// as shown above
}