2013-06-15 4 views
1

Используя 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 никогда не вызывается.

Является ли это проблемой конфигурации или фактической ошибкой?

Благодарим за помощь!

+0

Конечно, я могу хранить BusinessService в качестве атрибута SessionAttribute при обработке метода GET и получить его как атрибут ModelAttribute в методе POST, но я бы хотел как можно больше избегать использования сеанса. Неужели это можно сделать? – Spiff

ответ

1

Весна ConversionService и Converter s являются заменой стандартного Java Beans PropertyEditor s.

Вам необходимо реализовать Converter вместо PropertyEditor, если эта функция основана исключительно на службе преобразования.


Для регистрации пользовательских конвертеров в WebDataBinder вы могли бы использовать ConfigurableWebBindingInitializer или @InitBinder метод.

+0

Спасибо за ваш ответ, преобразование типа работает при регистрации пользовательского конвертера в ConversionService. Однако меня беспокоит, что есть два способа сделать преобразование типов (PropertyEditors and Converters) и что вы должны знать, какой из них использовать в этом случае. Думаю, я подам ошибку. – Spiff

+1

Весна была первоначально основана на редакторах свойств. Некоторые исходные компоненты остаются их поддержкой редактора свойств. Однако все новые функции основаны на конвертере. Три - не ошибка. –

+0

http://blog.springsource.org/2009/11/17/spring-3-type-conversion-and-validation/ –