Thymeleaf无法发布对象的集合/列表

时间:2015-11-13 16:00:00

标签: java hibernate spring-mvc thymeleaf

我正在使用spring MVC,hibernate和thymeleaf创建一个web应用程序。 我有一个可以管理用户的页面,在此页面上,您应该能够从组中放置和删除用户。 我这样做有2个多选框。 我添加了一个jquery脚本,用于处理用户从一个选择框到另一个选择框的移动。 但是当我提交时,我的Group.users对象列表是空的,我没有任何例外。 有人有什么建议吗?

提前致谢。

修改

我刚刚发现html标签“option”中的所有thymeleaf属性都没有编译。除了th:每个attr。 所以很明显问题出在我的百里香文件中。

Thymeleaf / edit.html:

    <!DOCTYPE html>

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:th="http://www.thymeleaf.org">
    <head>
    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
    <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
    <div th:replace="template :: css"></div>
    <title>Edit group</title>
    </head>
    <body>
        <script>
            $(document).ready(function() {
                $(".clickable").click(function() {
                    if ($(this).hasClass("selected")) {
                        $(this).removeClass("selected").addClass("unselected");
                        $('#userGroupContainer').append(this);
                        $("option:selected").css("background-color", "red");
                    } else {
                        $(this).removeClass("unselected").addClass("selected");
                        $('#userGroupContainerSelected').append(this);
                        $("option:selected").css("background-color", "green");
                    }
                });
            });
        </script>
        <div id="bodyWrap">
            <div th:replace="template :: logo">Logo</div>
            <div th:replace="template :: nav">Nav</div>
            <div th:replace="template :: messages">Header</div>
            <div id="backGround">
                <div id="contentWrap">
                    <form action="@{edit}"
                        th:action="@{${#httpServletRequest.servletPath}}"
                        th:object="${group}" th:method="post">
                        <h1 th:unless="${group.id}">Add group</h1>
                        <h1 th:if="${group.id}">Edit group</h1>
                        <hr />
                        <div th:replace="template :: messages">Header</div>
                        <div class="newFile">
                            <input type="hidden" th:field="*{id}" />
                            <table class="newFile">
                                <tr>
                                    <th>Name:</th>
                                    <td><input type="text" size="50" th:field="${group.name}" /></td>
                                </tr>
                                <tr>
                                    <th>Description:</th>
                                    <td><textarea th:field="${group.description}"></textarea></td>
                                </tr>
                                <tr>
                                    <td>&nbsp;</td>
                                </tr>
                            </table>
                            <br /> users <br />
                            <select multiple="multiple" id="userGroupContainer">
                                <option th:each="u : ${userNotInGroup}" th:text="${u.displayName}" class="clickable unselected" th:value="${u}" ></option>
                            </select>

<!-- It's all about the select box under this comment -->

                            <select multiple="multiple" id="userGroupContainerSelected" th:field="*{users}">
                                <option th:each="ug, rowStat : ${group.users}" th:text="${ug.displayName}" th:value="${ug}" class="clickable selected">Selected</option>
                            </select>

                            <div class="form-actions">
                                <button th:unless="${group.id}" type="submit">Add</button>
                                <button th:if="${group.id}" type="submit">Update</button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </body>
    </html>

2个多选框的示例:

		$(document).ready(function() {
			$(".clickable").click(function() {
				if ($(this).hasClass("selected")) {
					$(this).removeClass("selected").addClass("unselected");
					$('#userGroupContainer').append(this);
					$("option:selected").css("background-color", "red");
				} else {
					$(this).removeClass("unselected").addClass("selected");
					$('#userGroupContainerSelected').append(this);
					$("option:selected").css("background-color", "green");
				}
			});
		});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<select multiple="multiple" id="userGroupContainer">
							<option class="clickable unselected" >Example</option>
						</select>
						<select multiple="multiple" id="userGroupContainerSelected" th:field="*{users}">
							<option class="clickable selected">Selected</option>
						</select>

控制器:

@RequestMapping(value = "/management/edit/{groupId}", method = RequestMethod.GET)
public String editGroup(ModelMap model, Principal principal, @PathVariable("groupId") Long groupId) {
    Group group = groupService.findGroupById(groupId);
    User user = new User();
    List<User> userNotInGroup = userService.findUsersNotInGroup(group);
    model.addAttribute("userNotInGroup", userNotInGroup);
    model.addAttribute("group", group);
    return "management/groups/edit";
}

@RequestMapping(value = "/management/edit/{groupId}", method = RequestMethod.POST)
public String editGroup(@Valid Group group, BindingResult result, Model model, @PathVariable("groupId") Long groupId) {
    model.addAttribute("group", group);
    System.out.println("USERS: " + group.getUsers());
    groupService.saveGroup(group);
    return "redirect:/management/list";
}

组实体/对象:

@Entity
@Table(name = "GROUPS")
public class Group extends DomainObject {

    private static final long serialVersionUID = ;

    @Id
    @GeneratedValue(generator = "GROUPS_SEQ", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "GROUPS_SEQ", sequenceName = "GROUPS_SEQ")
    private Long id;

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

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

    @JoinTable(name = "USERS_GROUPS")
    @ManyToMany(fetch = FetchType.EAGER)
    private Collection<User> users;

    @JoinTable(name = "GROUPS_ROLES")
    @ManyToMany
    private Collection<Role> roles;


    public Collection<User> getUsers() {
        return users;
    }

    public void setUsers(Collection<User> users) {
        this.users = users;
    }
    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Collection<Role> getRoles() {
        return roles;
    }

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

}

用户实体/对象:

@Entity
@Table(name = "USERS")
public class User extends DomainObject implements UserDetails {

    private static final long serialVersionUID = ;
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @NotNull
    private Long ID;
    @Column(name = "DISPLAY_NAME")
    @NotNull
    private String displayName;
    @Column(name = "EMAIL_ADDRESS")
    @NotNull
    private String emailAddress;
    @Column(name = "PASSWORD")
    private String password;
    @Column(name = "USERNAME")
    @NotNull
    private String username;
    @Column(name = "LAST_LOGIN")
    private Date lastLogin;
    @Column(name = "MODIFIED_DATE")
    private Date modifiedDate;
    @Column(name = "MODIFIED_BY")
    private String modifiedBy;
    @Transient
    private Collection<? extends GrantedAuthority> authorities;
    private boolean admin;
    @Nullable
    @JoinTable(name = "USERS_GROUPS")
    @ManyToMany
    private Collection<Group> groups;

    public Date getLastLogin() {
        return lastLogin;
    }

    public void setLastLogin(Date lastLogin) {
        this.lastLogin = lastLogin;
    }

    public Collection<Group> getGroups() {
        return groups;
    }

    public void setGroups(Collection<Group> groups) {
        this.groups = groups;
    }


    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {
        this.authorities = authorities;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public boolean isAdmin() {
        return admin;
    }

    public void setAdmin(boolean admin) {
        this.admin = admin;
    }

    @Override
    public Long getId() {
        return ID;
    }

    @Override
    public void setId(Long id) {
        this.ID = id;
    }

}

0 个答案:

没有答案