1

Spring を使い始めたところ、解決できない問題が見つかりました。「ロール」プロパティを持つユーザーエンティティがあり、「ロール」はセットオブジェクトであり、エスティティは次のとおりです。

private String id;
private String name;
private String surname;
private String email;
private String identificationNumber;
private String username;
private String password;
private String passwordConfirm;
private int sex;
private Timestamp birthDate;
private Set<Role> roles;

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
public Set<Role> getRoles() {
    return roles;
}

public void setRoles(Set<Role> roles) {
    this.roles = roles;
}

私の「役割」エンティティは次のとおりです。

private String id;
private String name;
private Set<User> users;

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@ManyToMany(mappedBy = "roles")
public Set<User> getUsers() {
    return users;
}

public void setUsers(Set<User> users) {
    this.users = users;
}

JSPには、すべての「ロール」のリストを含むコンボボックスがあります

<spring:bind path="roles">
    <div class="input-field is-empty cell2">
        <form:select type="text" path="roles" class="validate ${status.error ? 'invalid' : ''}">
              <form:option value="NONE" selected="selected" disabled="true">Roles</form:option>
              <c:forEach items="${allRoles}" var="role">
                <form:option value="${role.getId()}" >${role.getName() }</form:option>
              </c:forEach>
          </form:select>
          <form:errors path="roles" class="alert alert-dismissible alert-danger">    </form:errors>
        <span class="material-input"></span>
    </div>
</spring:bind>

1 つまたは複数の「役割」を選択し、次のコントローラーにフォームを送信します。これには、選択した「役割」の ID のリストを持つ @RequestParam が存在します。

@RequestMapping(value="/user_edit/{id}", method=RequestMethod.POST)
public String edit_user(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, @PathVariable String id, @RequestParam String role_ids) {
    Set<Role> role_list = new HashSet<Role>();
    for (String role_id : role_ids.split(",")) {
        Role _role = roleService.getById(role_id);
        Role role = new Role();
        role.setName(_role.getName());
        role.setId(role_id);
        role_list.add(role);
    }
    userForm.setRoles(role_list);
    userValidator.validate(userForm, bindingResult, false);
    if (bindingResult.hasErrors()) {
        return "edit_user";
    }
    userService.save(userForm);
    return "redirect:/users";
}

行 userValidator.validate(userForm, bindingResult, false); プログラムは次のエラーを表示します。

Failed to convert property value of type [java.lang.String[]] to required type [java.util.Set] for property roles; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.gestcart.account.model.Role] for property roles[0]: no matching editors or conversion strategy found

この問題を解決するのを手伝ってください

4

1 に答える 1

0

String[] rolesSelect または List < String > rolesSelect として User Entity に新しいフィールドを作成する必要があります。エンティティクラスなのでスキップしたい場合は一時的にします。次に、モデル属性「ユーザー」からアクセスできるようになります。リクエストパラメーターを個別に必要としません。つまり、「< spring:bind path="roles" >」は必要ありません。jsp で以下のコードを使用します。

<form:select type="text" path="rolesSelect" class="validate ${status.error ? 'invalid' : ''}">
          <form:option value="NONE" selected="selected" disabled="true">Roles</form:option>
          <c:forEach items="${allRoles}" var="role">
            <form:option value="${role.getId()}" >${role.getName() }</form:option>
          </c:forEach>
      </form:select>
于 2016-07-15T06:08:53.447 に答える