Spring Webflow:虽然映射值在httprequest中,但绑定不适用于map

时间:2013-10-16 07:50:07

标签: java spring spring-webflow

这个问题与此非常相似: Collection/List property won't bind or update on form submit

我要做的是将JSP中的一组Checkbox映射到Webflow中的Map。绑定例如字符串到模型工作完全正常。但是,地图没有。这是一些示例代码: 模特:

public class MyForm {
  private String selectedOrderBy;
  private Map<String, boolean> selected = new HashMap<>();
  private List<MyClass> items = new ArrayList<>();
  //Now setters and getters for the members
}

public MyClass {
  private String hash = "<some hash>"; //plus getter and setter
}

流程:

<flow xmlns="http://www.springframework.org/schema/webflow"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/webflow
                      http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

    <var name="model" class="MyForm"/>
    <var name="selectedOrderBy" class="java.lang.String"/>

    <view-state id="selection" model="model">
      <binder>
        <binding property="selectedOrderBy"/>
        <binding property="selected"/>
      </binder>
      <transition on="submit" to="saveSelection"/>
    </view-state>

    <action-state id="saveSelection">
      <evaluate expression="MyService.saveSelection(model, externalContext.nativeRequest)"/>
      <transition to="selection"/>
    </action-state>
</flow>

JSP:

<form:form modelAttribute="model" method="post" enctype="application/x-www-form-urlencoded" acceptCharset="utf-8">
  ...here is some more code including a selectbox mapping to selectOrderBy...
  <table>
    <c:foreach items="${model.items}" var="item">
      <tr><td>
        <form:checkbox path="selected['${item.hash}']" value="true"/>
        ...
      </td></tr>
    </c:foreach>
  </table>
</form:form>

最后服务:

@Named
public class MyService {
  public void saveSelection(MyForm model, HttpServletRequest request){...}
}

复选框成功显示地图中的值。但是,在提交时,更改的值不会绑定到模型(而String“selectOrderBy”可以工作)。所以我调试到MyService#saveSelection,我发现模型中的地图仍然具有旧值。同时,新值实际上在请求中。

目前,我从请求中手动提取它们:

String selected = request.getParameter("selected['" + hash + "']");

但这是一些非常丑陋的解决方法。有没有人知道为什么会这样?

问候, 萨沙。

2 个答案:

答案 0 :(得分:1)

我无法解决最初的问题。但是,通过使用List而不是Map来绑定值,我能够以更清晰的方式实现类似的结果。 JSP现在说:

<form:checkbox path="selectedList" value="${myClass.hash}"/>

表格:

public class MyForm {
  private String selectedOrderBy;
  private List<String> selectedList = new ArrayList<>(); //selected Items hashes
  private List<MyClass> items = new ArrayList<>(); //All items, regardless of selectionstate
  //Now setters and getters for the members
}

在服务中,模型现在包含所选项目的列表。通过将它与可用项目列表(哈希)进行比较,您基本上可以得到相同的结果。

问候。

答案 1 :(得分:0)

删除绑定限制可使您的示例正常工作。我发现了一些改进请求,允许在版本3.0.0(https://jira.spring.io/browse/SWF-913)中添加似乎添加的绑定属性的通配符。

因此,为了使您的示例正常工作,我只需删除绑定限制。

<view-state id="selection" model="model">
    <transition on="submit" to="saveSelection"/>
</view-state>

另外,请注意,通过设置value =“true”,您将默认选择所有类。