複数のチェックボックス タグをレンダリングするために GET で初期化される Map フィールドにオブジェクトをバインドしようとしています。フォームが作成されるとすべてのチェックボックスが表示されますが、フォームが送信されると、MessageForm (モデル属性) オブジェクトの Map エントリはバインドされません (マップ サイズ = 0)。このマップ フィールドを追加する前は、他のフィールド (メッセージ) が適切に設定されていました。MessageForm.hierarchySelections フィールドを取得して、GET 要求で入力されたすべてのエントリを設定するにはどうすればよいですか?
unitNode.jsp (VIEW_MESSAGE_FORM):
<div class="nodeContainer">
<div class="nodeHeader">
<form:checkbox path="hierarchySelections['${node.code}']"/>
<form:label path="hierarchySelections['${node.code}']">
${node.name}
</form:label>
</div>
<div class="nodeChildren">
<c:forEach var="node" items="${node.children}">
<c:set var="node" value="${node}" scope="request"/>
<jsp:include page="unitNode.jsp"/>
</c:forEach>
</div>
</div>
MessageForm.java:
public class MessageForm {
private Message message;
private Map<String, Boolean> hierarchySelections = new HashMap<String, Boolean>();
// getters and setters
}
MessageFormController.java (抜粋):
@RequestMapping(value = "/message/new")
public String newMessage(final Model model) {
final MessageForm messageForm = new MessageForm();
// get the root hierarchy node
final Node rootNode = hierarchyService.getNodeHierarchy();
messageForm.getHeirarchy(rootNode);
final Stack<Node> nodeList = new Stack<Node>();
nodeList.add(rootNode);
final Map<String, Boolean> hierarchySelections = messageForm.getHierarchySelections();
while (!nodeList.isEmpty()) {
final Node node = nodeList.pop();
// set the selection status to false/unchecked
hierarchySelections.put(node.getCode(), Boolean.FALSE);
// add all children organization units to the stack
for (final Node nodeChild : node.getChildren()) {
nodeList.add(nodeChild);
}
}
model.addAttribute("messageForm", messageForm);
return VIEW_MESSAGE_FORM;
}
@RequestMapping(value = "/message/new", method = RequestMethod.POST)
public String createMessage(@Valid final MessageForm messageForm, final BindingResult bindingResult) {
if (bindingResult.hasErrors()) { // TODO
} else {
messageCenterService.createMessage(messageForm.getMessage());
}
return VIEW_MESSAGE_FORM;
}