地图提交到控制器后自动排序?



今天我遇到了这样一个奇怪的问题。
首先,我初始化一个映射,该映射在 jsp 中存储选定对象的数据。

Map<String, String> bankIds = ImmutableMap.<String, String>builder() // Dummy data
.put("", "")
.put("JobStart", "Job Start Bank")
.put("JobEnd", "Job End Bank")
.put("CspMod", "Bank For Completed CSP Builds. Stock For Second Level Build")
.put("TEMPBANK", "TEMPBANK")
.build();

在 jsp 中,我添加了一些隐藏字段来存储此地图,而无需从 DB 重新获取它。

<div id="hiddenAttributes" hidden="hidden">
<c:forEach var="entry" items="${lotSearchForm.bankIds}">
<form:input path="bankIds[${entry.key}]" />
</c:forEach>

但是提交到服务器后,地图已经按键排序。现在的顺序是:

{CspMod=Bank For Completed CSP Builds. Stock For Second Level Build, JobEnd=Job End Bank, JobStart=Job Start Bank, TEMPBANK=TEMPBANK, =}

结果是选择对象中选项的顺序发生了变化。

那么我的问题如下:
1.为什么地图提交到服务器后要排序?我使用了LinkedHashMap,但结果仍然是一样的。
2.有什么方法可以防止像我的问题一样在地图中自动排序?
3. 我的设计有什么解决方案吗?我的项目中禁止该会话。

谢谢

编辑
为了便于理解,这是我的上下文: 首先,我有一张这样的地图。

LinkedHashMap<String, String> bankIds = new LinkedHashMap<String, String>();
bankIds.put("", "");
bankIds.put("JobStart", "Job Start Bank");
bankIds.put("JobEnd", "Job End Bank");
bankIds.put("CspMod", "Bank For Completed CSP Builds. Stock For Second Level Build");
bankIds.put("TEMPBANK", "TEMPBANK");

所以,这张地图的顺序是 " --> JobStart --> JobEnd --> CspMod --> TEMPBANK
这是正确的顺序。

我像这样使用这张地图作为 jsp 中的选项。

<form:select path="bankId" items="${lotSearchForm.bankIds}"/>

在输出 html 中,选项的顺序与上面地图的顺序相同。
为了防止从数据库(map的数据(重新获取数据,我还添加了map的隐藏属性。

<div id="hiddenAttributes" hidden="hidden">
<c:forEach var="entry" items="${lotSearchForm.bankIds}">
<form:input path="bankIds[${entry.key}]" />
</c:forEach>
</div>

到目前为止,顺序是正确的。输出 html 的顺序
正确

<div id="hiddenAttributes" hidden="hidden">
<input type="text" name="bankIds[]" value="" />
<input type="text" name="bankIds[JobStart]" value="Job Start Bank" />
<input type="text" name="bankIds[JobEnd]" value="Job End Bank" />
<input type="text" name="bankIds[CspMod]" value="Bank For Completed CSP Builds. Stock For Second Level Build" />
<input type="text" name="bankIds[TEMPBANK]" value="TEMPBANK" />
</div>

但是当我执行搜索操作时,我从控制器接收的数据映射顺序不正确。
地图在提交到控制器后进行排序。现在,映射的顺序是:CspMod --> JobEnd --> JobStart -->
TEMPBANK --> "-

> 我想要的是收到的地图与初始化地图具有相同的顺序。
清楚?

映射没有定义的排序顺序,除非您使用专门的实现将其添加到顶部,例如,您使用 SortedSet/TreeSet/LinkedHashMap 代替。

番石榴不可变集使用基于哈希的排序 - 这是随机设计的。

最新更新