Spring @initbinder не вызывается при показе формы => Customditors не определены
-
26-09-2019 - |
Вопрос
Я следую (упрощенный в костный) контроллер:
@Controller
public class TestController {
@RequestMapping(value = "/test.htm", method = RequestMethod.GET)
public String showForm(final ModelMap map) {
final TestFilter filter = new TestFilter();
filter.setStartDate(new Date(System.currentTimeMillis()));
map.addAttribute("reportPerResourceForm", filter);
return "test";
}
@InitBinder
public void initBinder(final WebDataBinder binder) {
binder.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
}
}
JSP:
<form:form commandName="reportPerResourceForm" id="reportForm">
<form:input path="startDate" />
</form:form>
Это контроллер, который я быстро создал, чтобы проверить проблему, которую я имел с другим контроллером просмотра. Как вы можете видеть в контроллере, определяется пользовательский аппарат. В моем фактическом контроллере этот редактор работает нормально; При введении, например, 11/01/2010 в поле формы, это красиво преобразуется в дату редактором; Также при возврате к форме дата снова была красиво преобразована обратно в строку.
Тем не менее, когда я (как в TestController) хочу установить дату по умолчанию в форме, то это просто отображается дата .TOSTRING () в поле формы вместо использования возвращаемого значения из CustommDateeditor. После некоторой отладки я узнал, что мой метод INITBINDER не вызывается при запросе Method == Get. Это нормально?
Я уверен, что я мог бы обработать это, не используя
Спасибо за вашу помощь,
Stijn
Решение
использовать @ModelAttribute
Чтобы установить домен перед пересылкой на страницу.
тщательно использовать new
Когда вы имеете дело с Spring, он просто создаст новый экземпляр Object Oudle Spring Context, и вы не можете использовать любую пружинную способность (например, веб-привязку, Vavilation и т. Д.).
пример :
@RequestMapping(value = "/test.htm", method = RequestMethod.GET)
public String showForm(@ModelAttribute yourDomain, final ModelMap map)
И в вашем домене вы можете использовать:
@DateTimeFormat(pattern="dd/MM/yyyy")
private Date balance = new Date(System.currentTimeMillis());
Другие советы
Я не уверен, но второй аргумент в методе RecenterCustomeditor установлен на NULL. Этот аргумент состоит в том, чтобы установить имя поля, с которым вы хотите связать редактор, поэтому я точно не знаю, что произойдет, когда он будет установлен на NULL. Если вы хотите использовать этот редактор со всеми полями определенного типа, он существует тот же метод без этого параметра:
public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)
Я бы попробовал с этим, хотя я не уверен, что это решит проблему.
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
Надеюсь, поможет.
Чтобы решить это, я сам следующую код в моем контроллере:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor(categoryService));
}
@ModelAttribute("categoryList") // Populate reference-data (EG select-lists) in the view. (p. 390-
391).
public List<Category> populateCategoryList() {
return categoryService.list();
}
// Note: without adding "BindingResult result" to the following prototype
// (and preceding it with a @ModelAttribute("categoryList") -
// my initBibder() method does not get called!
// I discovered and added this hokum in response to the following links:
// http://forum.springsource.org/showthread.php?46837-InitBinder-not-called
// http://forum.springsource.org/showthread.php?46876-Custom-date-format-on-GET-requests&p=154820
@RequestMapping("/site/list.htm")
@ModelAttribute("sites") // 20110819
public ModelAndView listSite(
@ModelAttribute("category") Category category,
BindingResult result
)
{
// List<Site> sites = siteService.list();
List<Site> sites = new ArrayList<Site>(); // = siteService.list();
return new ModelAndView("siteList", "sites", sites);
}
}
Мои проблемы были с моим классом «категории», не признанным, потому что @InitBinder не звонил. «Секрет» здесь было изменение моего метода «@requeptmapping», чтобы включить - в его прототипе - 2 параметра, которые мне не нужно:
@Modelattribute («категория») Категория категории,
Результат BindingResult.
Это решило все (я знаю, что это не волшебство, просто дым, зеркала и java-отражение - но я желаю, чтобы напечатанную и онлайн-литературу обрабатывало бы простые случаи использования, как это соответственно).
Вот соответствующий код в моем соответствующем файле JSP:
<div>
Select a category:
<form:select path="category">
<form:options items="${categoryList}" itemValue="id" itemLabel="name"
/>
</form:select>
</div>