Я обновляю веб-приложение Spring 2.5 до Spring 5.0.3.Я использую строковые теги формы.В моем контроллере у меня есть:
@InitBinder
public void initBinder(WebDataBinder binder, HttpServletRequest request) {
CapTypeEditor capTypeEditor = new CapTypeEditor(this.getDAOFactory());
binder.registerCustomEditor(CapType.class, "order.capType.id", capTypeEditor);
}
Я вижу, что это вызывается дважды (почему?) На GET и дважды на POST.На GET request.getParameter ("order.capType.id") имеет значение null, то же самое в POST имеет правильный идентификатор.Но затем в моем POST-методе submit () capType не имеет значение null, но имеет только заполненный идентификатор, а не его имя:
@RequestMapping(value = "/es/orderinfo.html", method=RequestMethod.POST)
public ModelAndView submit(@RequestParam("id") long id,
@ModelAttribute("command")OrderInfoBean bean,
BindingResult errors, ModelMap model,
HttpServletRequest request) {
Order order = bean.getOrder();
CapType ct = order.getCapType();
...
}
Мой редактор CapType никогда не вызывается:
public class CapTypeEditor extends PropertyEditorSupport {
DAOFactory daoFactory;
public CapTypeEditor(DAOFactory daoFactory){
this.daoFactory = daoFactory;
}
public void setAsText(String text){
if(StringUtils.isBlank(text)||StringUtils.isEmpty(text) ){
this.setValue(null);
return;
}
Long id = Long.valueOf(text);
CapType capType = daoFactory.getCapTypeDAO().read(id);
this.setValue(capType);
}
public String getAsText(Object value){
if(value == null) return StringUtils.EMPTY;
CapType capType = (CapType)value;
return capType.getId().toString();
}
}
Мой JSP выглядит так:
<form:select path="order.orderType.id" tabindex="100" cssStyle="width:149px">
<form:option value="">none</form:option>
<form:options items="${refData.orderTypes }" itemValue="id" itemLabel="typeName" />
</form:select>