2012-05-15 3 views
1

Я переношу приложение с Spring 2.0.7 на 3.1.1, и я столкнулся с проблемой с initBinder. Раньше у нас были методы, похожие на@InitBinder с использованием командного объекта в редакторах свойств ...

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { 
    MyCommand command = (MyCommand)binder.getTarget(); 
    binder.registerCustomEditor(CustomerCard.class, createEditorFromCommand(command)); 
} 

где цель используется PropertyEditor. Этот метод больше не вызывается, когда я сделал это аннотированный контроллер поэтому я добавил @InitBinder аннотации:

@InitBinder 
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { 
    MyCommand command = (MyCommand)binder.getTarget(); 
    binder.registerCustomEditor(CustomerCard.class, createEditorFromCommand(command)); 
} 

binder.getTarget() К сожалению, это просто какой-то объект по умолчанию. Документация @InitBinder также утверждает, что я не могу получить команду в качестве параметра либо:

Таких методы инициализации-связующих поддерживают все аргументы, которые {@link RequestMapping} поддерживает для команд/форм объектов, за исключением и соответствующие объекты результатов проверки.

Каков правильный способ сделать это?

ответ

0
@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    MyCommand command = (MyCommand)binder.getTarget(); 
    binder.registerCustomEditor(CustomerCard.class, createEditorFromCommand(command)); 
} 
+0

Этот код дает ту же проблему. Команда - это просто «объект», а не моя зарегистрированная команда. –

0
@RequestMapping 
// binder will return MyCommand on getTarget() 
public void handleMyCommand(MyCommand c) { 
... 
} 

// initialize command before handleMyCommand method call 
@ModelAttribute 
public MyCommand initializeMyCommand() { 
    // perform initialization. 
} 

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    MyCommand c = (MyCommand) binder.getTarget(); 
    binder.registerCustomEditor(CustomerCard.class, createEditorFromCommand(c)); 
} 

Но, как команда неинициализированная ¿Почему вы не звоните в createEditorFromCommand(new MyCommand()) напрямую?

+0

Команда не должна быть неинициализирована, вот что. Я думаю, что моя проблема в том, что я объединяю старые иерархии классов Spring с аннотациями. Сейчас я как бы между ними, пытаясь перейти к новому способу по одному контроллеру за раз. У меня есть старый 'formBackingObject', но поскольку этот не вызван Spring больше, я создал новый метод с' @ ModelAttribute', который затем вызывает этот старый 'formBackingObject'. Тем не менее, '@ ModelAttribute' ничего не делает с возвращаемым из метода объектом команды, верно? Есть ли другой способ «зарегистрировать» команду? –

+0

Для инициализации команд используйте методы @ModelAttribute для методов. Я просто редактирую ответ с примера. –

+0

Я сделал это. Кажется, проблема заключается в том, что 'initBinder' вызывается более одного раза. Помимо метода '@ ModelAttribute', подобного выше, у меня также есть void-возвращающий тот, который берет модельную карту и накладывает на нее множество вещей. Кажется, initBinder призван ко всему. Я получил его работу с выполнением instanceof-check на цель, но это кажется взломанным ...? –

0

Вероятно, немного опоздал на вечеринку, но все же - вот путь к эталонной модели (команда) объекта в методе @InitBinder:

@InitBinder("commandName") 
public void initBinder(WebDataBinder binder) throws Exception { 
    CommandClass command = (CommandClass) binder.getTarget(); 
    binder.registerCustomEditor(Some.class, new SomeEditor(command.getOptions()); 
} 

@ModelAttribute("commandName") 
public OrderItem createCommand(HttpServletRequest request) { 
    return new CommandClass(); 
} 

Это может быть хорошей идеей, чтобы положить @InitBinder (» что-то "), а не просто @InitBinder. Таким образом, @InitBinder не будет вызываться несколько раз, а только вызывается, когда встречается настроенный объект.

Смежные вопросы