Java Thymeleaf#lists.contains()表达式实用程序不起作用
我正在使用thymeleaf标准方言,并尝试在表单中呈现复选框列表。渲染是正常的,但是问题是我尝试使用thymeleaf#lists.contains()表达式实用程序方法将“checked”属性应用于复选框 因此,我有一个模型类,它具有以下字段:Java Thymeleaf#lists.contains()表达式实用程序不起作用,java,expression,thymeleaf,Java,Expression,Thymeleaf,我正在使用thymeleaf标准方言,并尝试在表单中呈现复选框列表。渲染是正常的,但是问题是我尝试使用thymeleaf#lists.contains()表达式实用程序方法将“checked”属性应用于复选框 因此,我有一个模型类,它具有以下字段: private List<Template> templates; @FormParam("selectedTemplates") private List<String> selectedTemplates = Lists
private List<Template> templates;
@FormParam("selectedTemplates")
private List<String> selectedTemplates = Lists.newArrayList();
私有列表模板;
@FormParam(“选定模板”)
私有列表selectedTemplates=Lists.newArrayList();
ThymileAF模板html片段:
<div th:each="template : *{templates}">
<input type="checkbox" name="selectedTemplates" th:value="${template.id}"
th:checked="${#lists.contains(product.selectedTemplates, template.id)}" />
<label th:text="${template.filename} + ' (' + ${template.description} + ')'" />
<!-- Attempt to use the list contains to check the field -->
<div th:text="${product.selectedTemplates}"/>
<div th:text="${template.id}"/>
<div th:text="${#lists.contains(product.selectedTemplates, template.id)}" />
</div>
页面上应选中其中一个复选框的输出
<input type="checkbox" name="selectedTemplates" value="4" /> (Template Name)
<div>[4,5]</div>
<div>4</div>
<div>false<div>
(模板名称)
[4,5]
4.
假的
如您所见,我打印了包含值[4,5]的列表,并使用#lists.contains方法查看其中是否包含template.id,但是,该方法始终返回false。我甚至尝试了一些硬编码的ID来测试这个方法,结果总是返回“false”
例如:
<div th:text="${product.selectedTemplates}"/>
<div th:text="${#lists.contains(product.selectedTemplates, 4)}" />
<div th:text="${#lists.contains(testList, "3")}"/>
<div th:text="${#lists.contains(testList, "P")}"/>
打印[4,5]错误
<div th:text="${product.selectedTemplates}"/>
<div th:text="${#lists.contains(product.selectedTemplates, '4')}" />
打印[4,5]错误
<div th:text="${product.selectedTemplates}"/>
<div th:text="${#lists.contains(product.selectedTemplates, '4')}" />
我不确定我做错了什么,但它看起来很直截了当,不确定还有什么可以尝试的。我猜语法有问题。非常感谢您的任何建议。我找不到有关解决此问题的任何资源,ThymileAF指南很快就忽略了该部分。正如我所看到的,您选择的模板包含模板列表,而不是ID,对吗 如果是这种情况,您应该检查如下列表:
<input type="checkbox" name="selectedTemplates" th:value="${template.id}" th:checked="${#lists.contains(product.selectedTemplates, template)}" />
我做了一些进一步的实验,发现了一个问题,即#lists.contains()实用程序方法不适用于单个字符串。我想补充一点,我使用的是thymeleaf 2.0.19,但也尝试了2.1.1.RELEASE,得到了相同的结果 我在模型中创建了一个简单列表,并添加了一些值:
@FormParam("testList")
private List<String> testList = Lists.newArrayList();
testList.add("test1");
testList.add("test2");
testList.add("3");
testList.add("P");
testList.add("33");
如果没有它,contains方法将返回“false”,因为template.id是一个长类型。我知道这个问题很老,但是我发布了这个答案,以便对其他有相同问题的用户有用 我不知道是你还是其他用户,但我发现我们必须添加 ''+模板id 因此:
对我来说,成功了!谢谢你我在thymeleaf论坛上提出了这个答案,并得到了一些帮助来确定根本原因和解决方案。看[ 基本上,默认情况下,单个字符串被解释为字符类型,因此从不匹配列表中的任何字符串。多个字符串计算为字符串类型,因此工作正常。通过将搜索的值封装在html编码的引号中,解析器被迫计算单个字符串将racter字符串作为字符串类型而不是char类型。例如:
<div th:text="${product.selectedTemplates}"/>
<div th:text="${#lists.contains(product.selectedTemplates, 4)}" />
<div th:text="${#lists.contains(testList, "3")}"/>
<div th:text="${#lists.contains(testList, "P")}"/>
我只是想发布这篇文章,以防有人对根本原因和解决方案感兴趣。列出selectedTemplates只是id而不是“模板”实体。我没有想过要这样做。我找到了一个工作,我将在回答中发布。这很奇怪。就我在ListUtils的代码中所见,contains方法只是在目标列表上调用contains。在您的情况下,它将等于${product.targetList.contains('3')}。你能检查一下结果是否正确吗?在3的情况下,我可以想象它突然被视为int,然后列表将真的不包含它,但是使用“P”应该返回真的true。或者更糟糕的是,“P”被视为char。对于包含反馈的hanks的字符串列表,这是否会返回true没有线索Martin,i尝试了您建议的代码:${product.testList.contains('3')},${product.testList.contains('P')},${product.testList.contains('33')},结果是相同的:“false”、“false”、“true”,所以可能是它试图错误地推断类型,因此无法使用单个字符。
<div th:text="${#lists.contains(testList, "3")}"/>
<div th:text="${#lists.contains(testList, "P")}"/>