Spring-mvc 3.0 crud с вопросом о флажках - PullRequest
3 голосов
/ 17 августа 2010

Я делаю простой пользователь crud.

My ApplicationUser имеет следующие свойства:

private Long id;
private String password;
private String username;
private Collection<Authority> myAuthorities;
private boolean isAccountNonExpired;
private boolean isAccountNonLocked;
private boolean isCredentialsNonExpired;
private boolean isEnabled;

Класс полномочий имеет:

private Long id;
private String authority;
private String name;

В моемJSP, мой взгляд имеет следующую форму:

<form:form modelAttribute="applicationUser"
    action="add" method="post">
    <fieldset>

    <form:hidden path="id" />

    <legend><fmt:message key="user.form.legend" /></legend>
    <p><form:label for="username" path="username" cssErrorClass="error"><fmt:message key="user.form.username" /></form:label><br />
    <form:input path="username" /> <form:errors path="username" /></p>

    <p><form:label for="password" path="password"
        cssErrorClass="error"><fmt:message key="user.form.password" /></form:label><br />
    <form:password path="password" /> <form:errors path="password" /></p>

    <p><form:label for="password" path="password"
        cssErrorClass="error"><fmt:message key="user.form.password2" /></form:label><br />
    <form:password path="password" /> <form:errors path="password" /></p>

    <p><form:label for="myAuthorities" path="myAuthorities"
        cssErrorClass="error"><fmt:message key="user.form.autorities" /></form:label><br />
    <form:checkboxes items="${allAuthorities}" path="myAuthorities" itemLabel="name"/><form:errors path="myAuthorities" /></p>

    <p><input type="submit"/></p>
    </fieldset>
</form:form>

JSP получает allAuthorities из этого:

@ModelAttribute("allAuthorities")
public List<Authority> populateAuthorities() {
  return authorityService.findAll();
}

Когда я заполняю форму, я получаю:

Не удалось преобразовать значение свойства типа java.lang.String в требуемый тип java.util.Collection для свойства myAuthorities;вложенное исключение - java.lang.IllegalStateException: невозможно преобразовать значение типа [java.lang.String] в требуемый тип [com.tda.model.applicationuser.Authority] для свойства myAuthorities [0]: не найдено подходящих редакторов или стратегии преобразования

Как правильно решить эту проблему?

1 Ответ

5 голосов
/ 17 августа 2010

HTML-формы работают только со строковыми значениями, когда ваш Authority является сложным компонентом. Вам необходимо настроить PropertyEditor для выполнения преобразования между Authority и String:

@InitBinder 
public void initBinder(WebDataBinder b) {
    b.registerCustomEditor(Authority.class, new AuthorityEditor());
}

private class AuthorityEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(authorityService.findById(Long.valueOf(text)));
    }

    @Override
    public String getAsText() {
        return ((Authority) getValue()).getId();
    }
}
...