我有以下设置:
public class MyController extends BaseFormController {
public MyController() {
setCommandClass(MyObject.class);
setCommandName("object");
setSessionForm("true);
}
@Override
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
throws Exception {
MyObject o = (MyObject) command;
...
}
MyObject有一个MyOtherObject类型的成员,而MyOtherObject又有一个成员Set<String> foo
:
public class MyObject {
...
MyOtherObject otherObject;
...
}
public class MyOtherObject {
...
Set<String> foo = new HashSet<String>();
...
}
实现了所有相应的setter和getter。然后我有了一个用jsp编写的视图:
<form:form method="POST" action="" commandName="object" ...
...
<form:select path="otherObject.foo" multiple="multiple" size="4">
<c:forEach var="entry" items="${listOfItems}">
<option value="${entry.size}" <c:if test="${!entry.enabled}">disabled</c:if>>${entry.name}</option>
</c:forEach>
</form:select>
...
</form:form>
我的目标是将列表中某些条目的size
映射到集foo
。
表单中的所有其他条目都设置为用户键入的值,因此整体语法应该是正确的。然而,当涉及到应该映射到object.otherObject.foo的这个多选表单时,控制器就好像在视图中没有提供任何值,即使我在命中之前从框中选择多个值提交时,Controller中的command
对象仍然会获得一个空的otherObject.foo成员。
可能导致此问题的任何想法?
P.S。我还尝试在MyObject中直接添加Set<String> foo
并在视图的path=""
中使用它。它仍然没有成功。
答案 0 :(得分:0)
您是否覆盖了formBackingObject方法?如果是,您是否将MyOtherObject分配给MyObject?
答案 1 :(得分:0)
经过大量的探索后,我发现了解决方案 - foo必须被声明为String[] foo
,并且从那里开始照顾所有其余的,就像预期的那样。打败我为什么春天会在这个时代使用“老式”阵列,但显然确实如此。