Java Thymeleaf#lists.contains()表达式实用程序不起作用

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

我正在使用thymeleaf标准方言,并尝试在表单中呈现复选框列表。渲染是正常的,但是问题是我尝试使用thymeleaf#lists.contains()表达式实用程序方法将“checked”属性应用于复选框

因此,我有一个模型类,它具有以下字段:

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, &quot;3&quot;)}"/>
<div th:text="${#lists.contains(testList, &quot;P&quot;)}"/>

打印[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, &quot;3&quot;)}"/>
<div th:text="${#lists.contains(testList, &quot;P&quot;)}"/>


我只是想发布这篇文章,以防有人对根本原因和解决方案感兴趣。

列出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, &quot;3&quot;)}"/>
<div th:text="${#lists.contains(testList, &quot;P&quot;)}"/>