Используя Spring 3.2.3, я пытаюсь реализовать простой CRUD-контроллер, который обрабатывает URL-адреса REST-ful. Он полагается на PropertyEditor для преобразования переменной пути в объект BusinessService, загружая ее из службы приложения. Код выглядит следующим образом:Spring MVC - PropertyEditor не вызывается при преобразовании типа ModelAttribute
@Controller
public class BusinessServiceController {
@Autowired
private BusinessServiceService businessSvcService;
public BusinessServiceController() {
}
@InitBinder
public void initBinder(final WebDataBinder binder) {
binder.registerCustomEditor(BusinessService.class, new BusinessServicePropertyEditor(businessSvcService));
}
@RequestMapping(value = "/ui/account/business-services/{businessSvc}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ModelAndView update(@ModelAttribute("businessSvc") @Valid final BusinessService businessSvc, final BindingResult result,
final RedirectAttributes redirectAttribs) throws UnknownBusinessServiceException {
ModelAndView mav;
if (result.hasErrors()) {
mav = new ModelAndView("/business-service/edit");
}
else {
businessSvcService.updateBusinessService(XSecurity.principal().getId(), businessSvc);
mav = new ModelAndView("redirect:/ui/account/business-services");
redirectAttribs.addFlashAttribute("message", Message.info("businessService.updated", businessSvc.getTitle()));
}
return mav;
}
}
public class BusinessServicePropertyEditor extends PropertyEditorSupport {
private final BusinessServiceService businessSvcService;
public BusinessServicePropertyEditor(final BusinessServiceService businessSvcService) {
this.businessSvcService = businessSvcService;
}
@Override
public String getAsText() {
final BusinessService svc = (BusinessService) getValue();
return Long.toString(svc.getId());
}
@Override
public void setAsText(final String text) {
final BusinessService svc = businessSvcService.getBusinessService(Long.parseLong(text));
setValue(svc);
}
}
Согласно SPR-7608, начиная с весны 3.2, проверяет разрешение метода аргумента @ModelAttribute, если переменный путь, по тому же имени (он делает здесь), в этом случае он пытается преобразовать его значение переменной пути к типу целевого параметра через зарегистрированные преобразователи и PropertyEditors. Это не то, что я испытываю. Когда я проверяю, что делает ServletModelAttributeMethodProcessor, он явно использует запрос ConversionService DataBinder для выполнения преобразования типов, который не учитывает зарегистрированные PropertyEditors, и, следовательно, BusinessServicePropertyEditor # setAsText никогда не вызывается.
Является ли это проблемой конфигурации или фактической ошибкой?
Благодарим за помощь!
Конечно, я могу хранить BusinessService в качестве атрибута SessionAttribute при обработке метода GET и получить его как атрибут ModelAttribute в методе POST, но я бы хотел как можно больше избегать использования сеанса. Неужели это можно сделать? – Spiff