我正在使用 Spring MVC 创建 Web,但我仍然是 Spring 的初学者。我有两个具有多对多关系的实体。在实践中,我有 UserGroup,它可以有许多或一个(或没有)UserAuthority 我想使用多选表单来编辑这些关系。创建新的 UserGroup 实体或编辑现有的实体可以正常工作,但有一个小问题:编辑现有的 UserGroup 时,选择框中没有选择适当的权限。我已经为此工作了一天多没有成功。有人可以帮帮我吗?
我的实体模型是:
@Entity
public class UserGroup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_group_has_user_authority",
joinColumns = {
@JoinColumn(name = "user_group_id")},
inverseJoinColumns = {
@JoinColumn(name = "user_authority_id")})
private Set<UserAuthority> authorities;
}
(我省略了 getter 和 setter,但我的代码中有它们)
和
public class UserAuthority {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String code;
private String name;
}
(同样,我省略了 setter 和 getter)。
我的表格如下所示:
<form:form action="${action}" method="post" commandName="userGroup" id="user-group-form">
<form:input readonly="true" cssClass="dn" path="id"/>
<table>
<tr>
<td>
<form:label path="title">Title</form:label>
<form:errors path="title" />
</td>
<td>
<form:input path="title"/>
</td>
</tr>
<tr>
<td>
<form:label path="authorities">Authorities</form:label>
<form:errors path="authorities" />
</td>
<td>
<form:select path="authorities" multiple="true" items="${authoritiesList}" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Save" />
</td>
</tr>
</table>
</form:form>
我的控制器方法如下:
@RequestMapping(value = "/editGroup", method = RequestMethod.GET)
public ModelAndView editGroup(Model model, HttpServletRequest request) {
Long id = null;
UserGroup userGroup = null;
HashMap<String, Object> editModel = new HashMap<>(2);
try {
id = Long.parseLong(request.getParameter("id"));
} catch (NumberFormatException ex) {
}
if (id != null) {
userGroup = groupsManager.get(id);
}
UserGroupData userGroupData = groupsManager.createFromUserGroup(userGroup);
editModel.put("userGroup", userGroupData);
editModel.put("authoritiesList", getAuthoritiesList());
return new ModelAndView("/users/groupEdit", editModel);
}
@RequestMapping(value = "/editGroup", method = RequestMethod.POST)
public String updateGroupAction(@ModelAttribute("userGroup") @Validated UserGroupData userGroupData, BindingResult result, Model model, HttpServletRequest request) {
if (result.hasErrors()) {
model.addAttribute("userGroup", userGroupData);
return "/users/groupEdit";
}
groupsManager.saveUserGroupData(userGroupData);
return "redirect:/users/listGroup";
}
private Map <Long, String> getAuthoritiesList() { //I also tried returning Map<String,String> but result was same.
Map<Long,String> authorities = new LinkedHashMap<>();
for (UserAuthority ua : authorityManager.getAll()) {
authorities.put(ua.getId(), ua.getName());
}
return authorities;
}
最后,我使用这个转换器从 String 创建 UserAuthority(实际上我在某处搜索过这个,但它有效:)) public class StringToUserAuthorityConverter implements Converter {
/**
* The string that represents null.
*/
private static final String NULL_REPRESENTATION = "null";
@Autowired
private UserAuthorityDao authorityDao;
@Override
public UserAuthority convert(final String id) {
if (id.equals(NULL_REPRESENTATION)) {
return null;
}
Long lId = null;
try {
lId = new Long(id);
} catch (NumberFormatException e) {
}
return authorityDao.find(lId);
}
}
正如我所说,所有创建和编辑工作,我唯一的问题是,在编辑现有组时未选择已经与组关联的权限。任何帮助将不胜感激。
编辑
我发现了两件事,也许它可以帮助:
1)在html页面中,有以下字段:
<input type="hidden" value="1" name="_authorities">
我读到它应该包含我的权限字段表单模型的值,但无论如何,在我的情况下它总是包含 1
2)如果我的表单验证失败(这意味着如果我没有输入标题,这是强制性的)表单会重新加载并显示错误消息,但选择框为空。不是有什么征兆吗?
编辑 2
我从上次编辑中解决了第 2 点)...