Редакторы пользовательских свойств не работают для параметров запроса в Spring MVC?

Я пытаюсь создать веб-контроллер с несколькими действиями, используя аннотации Spring. Этот контроллер будет отвечать за добавление и удаление профилей пользователей и за подготовку справочных данных для jsp-страницы.

@Controller
public class ManageProfilesController {
    @InitBinder
    public void initBinder(WebDataBinder binder) { 
        binder.registerCustomEditor(UserAccount.class,"account", new UserAccountPropertyEditor(userManager)); 
        binder.registerCustomEditor(Profile.class, "profile", new ProfilePropertyEditor(profileManager));
        logger.info("Editors registered");
    }

    @RequestMapping("remove")
    public void up( @RequestParam("account") UserAccount account,
                @RequestParam("profile") Profile profile) {
        ...
    }

    @RequestMapping("")
    public ModelAndView defaultView(@RequestParam("account") UserAccount account) {
        logger.info("Default view handling");
        ModelAndView mav = new ModelAndView();
        logger.info(account.getLogin());
        mav.addObject("account", account);
        mav.addObject("profiles", profileManager.getProfiles());
        mav.setViewName(view);
        return mav;
    }
    ...
}

Вот часть моего файла webContext.xml:

<context:component-scan base-package="ru.mirea.rea.webapp.controllers" />
<context:annotation-config/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
            <value>
               ...
              /home/users/manageProfiles=users.manageProfilesController
            </value>
    </property>
</bean>

<bean id="users.manageProfilesController" class="ru.mirea.rea.webapp.controllers.users.ManageProfilesController">
    <property name="view" value="home\users\manageProfiles"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

Однако, когда я открываю сопоставленный URL-адрес, я получаю исключение:

java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [ru.mirea.rea.model.UserAccount]: no matching editors or conversion strategy found

Я использую Spring 2.5.6 и планирую перейти на Spring 3.0 в не очень отдаленном будущем. Однако согласно этой JIRA https://jira.springsource.org/browse/SPR-4182 это должно быть возможно уже весной 2.5.1.

Отладка показывает, что метод InitBinder вызывается правильно.

Что я делаю неправильно?

Обновлять:

public class UserAccountPropertyEditor extends PropertyEditorSupport {
    static Logger logger = Logger.getLogger(UserAccountPropertyEditor.class);

    public UserAccountPropertyEditor(IUserDAO dbUserManager) {
        this.dbUserManager = dbUserManager;
    }

    private IUserDAO dbUserManager;

    public String getAsText() {
        UserAccount obj = (UserAccount) getValue();
        if (null==obj) {
                return "";
        } else {
            return obj.getId().toString();
        }
    }

    public void setAsText(final String value) {
        try {   
            Long id = Long.parseLong(value);
            UserAccount acct = dbUserManager.getUserAccountById(id);
            if (null!=acct) {
                super.setValue(acct);
            } else {
                logger.error("Binding error. Cannot find userAccount with id  ["+value+"]");
                throw new IllegalArgumentException("Binding error. Cannot find userAccount with id  ["+value+"]");
            }
        } catch (NumberFormatException e) {
            logger.error("Binding error. Invalid id: " + value);
            throw new IllegalArgumentException("Binding error. Invalid id: " + value);
        }
    }
}

В журнале UserAccountPropertyEditor нет ошибок.


person dvd    schedule 08.06.2010    source источник


Ответы (1)


Я не думаю, что вы хотите указать аргумент field для WebDataBinder.registerCustomEditor(). Это предназначено для работы вместе с объектами поддержки формы, и вы не используете это.

Вместо этого попробуйте более простой метод с двумя аргументами, и он должен работать:

binder.registerCustomEditor(UserAccount.class, new UserAccountPropertyEditor(userManager)); 
binder.registerCustomEditor(Profile.class, new ProfilePropertyEditor(profileManager));
person skaffman    schedule 08.06.2010
comment
Кажется, это работает! Я проведу еще несколько тестов завтра, когда доберусь до работы. Если все будет хорошо, тогда я приму ответ. Спасибо! - person dvd; 09.06.2010