【问题标题】:Spring Boot, Thymeleaf, ManyToMany checkboxes evaluationSpring Boot、Thymeleaf、ManyToMany 复选框评估
【发布时间】:2016-06-04 04:51:06
【问题描述】:

我在 Internet 上看到了很多示例,并且看起来该解决方案应该可以正常工作。但仍然无法使我的代码正常工作。

用户:

@Entity
@Table(name = "users")
public class User implements Serializable{

private static final long serialVersionUID = 1L;    
...

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "user_usertypes", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "usertype_id", referencedColumnName = "id"))
private Set<UserType> userTypes;
}

用户类型:

@Entity
@Table(name = "usertypes")
public class UserType implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@Version
@Column(name = "version")
private Integer version;

@Column(name = "name")
private String name;

@ManyToMany(mappedBy = "userTypes")
private Set<User> users;

@Override
public int hashCode() {
    int hash = 5;
    hash = 83 * hash + Objects.hashCode(this.id);
    return hash;
}

@Override
public boolean equals(Object obj) {
    System.out.println("comparing objects");
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()){
        return false;
    }
    final UserType other = (UserType) obj;
    return Objects.equals(this.id, other.id);
}
}

用户控制器:

@Controller
public class UserController {
    @RequestMapping(value = "/user", method = RequestMethod.POST)
public String saveUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "users/userform";
    }
    System.out.println(user.getUserTypes());
    userService.saveUser(user);
    return "redirect:/user/" + user.getId();
}

@InitBinder
private void initBinder(ServletRequestDataBinder binder) {

    binder.registerCustomEditor(Set.class, "userTypes", new CustomCollectionEditor(Set.class) {
        protected Object convertElement(Object element) {
            if (element != null) {
                System.out.println("From Controller: " + element.toString());
                return userTypeService.findOne(Integer.parseInt(element.toString()));
            }
            return null;
        }

    });
}

用户表单:

<form th:object="${user}" th:action="@{/user}" method="post">
<input type="hidden" th:field="*{id}"/>
<ul>
   <li th:each="type : ${types}">
     <input type="checkbox"  th:id="${type.id}" th:field="*{userTypes}" th:value="${type.id}"/>
     <label th:for="${type.id}" th:text="${type.name}">name</label>
   </li>
 </ul>
<form>

在提交时不调用 initBinder。仅在页面加载时。 因此,我的控制器无法获取 userTypes 对象。什么不见​​了?谢谢!

【问题讨论】:

  • 发帖:id=1&amp;version=77&amp;contact.id=14&amp;contact.version=0&amp;userTypes=1&amp;_userTypes=on&amp;userTypes=2&amp;_userTypes=on&amp;_csrf=dfffa09b-be52-4d1a-9725-f623aeba81c2

标签: spring-boot thymeleaf


【解决方案1】:

我找到了一个简单快捷的解决方案。可能不是最好的,但它按预期工作。希望对某人有所帮助。

用户实体:

private List<UserType> userTypes = new ArrayList<>();

在控制器中,我创建了一个助手,它为当前用户创建一个新列表以匹配表单上的索引:

public String edit(@PathVariable Integer id, Model model) {
    model.addAttribute("user", updatedTypes(userService.getUserById(id)));
    model.addAttribute("types", userTypeService.getAllUserTypes());
    return "users/userform";
}

private User updatedTypes(User user) {
    List<UserType> userTypes = new ArrayList<>();
    for (long i = 0; i < userTypeService.count(); i++) {
        userTypes.add(new UserType());
    }
    for (UserType type : user.getUserTypes()) {
        userTypes.add(type.getId() - 1, type);
    }
    user.setTypes(userTypes);
    return user;
}

模板:

 <li th:each="type, stat : ${types}">
     <input type="checkbox" th:field="*{userTypes[__${stat.index}__]}"
           th:value="${type.id}"/>
     <label th:for="|userTypes${stat.index}|+1" th:text="${type.name}">
           name
     </label>
 </li>

另外,我摆脱了 initBinder 方法。我不知道为什么,但它绝对没用。

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-06-11
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多