我正在将一个 java 对象传递到 thymeleaf 中。但该对象包含另一个对象,这就是我遇到问题的地方。在我的 java 代码中,我有以下内容:
context.setVariable("person",getPerson());
Person 类中有一个枚举,我可以从中执行以下操作:
person.getEnum().getDescription();
这是我的 thymeleaf xml:
<MyTag th:attr="Description=${person.getEnum()!=null} ? ${#objects.nullSafe(person.getEnum().getDescription(),'')} : '',Id=${person.getEnum()()!=null} ? ${#objects.nullSafe(person.getEnum()().getId(),'')} : ''"/>
我想要得到的最终结果是:
< MyTag Desciption="" Id=""/>
但我得到的是:
< MyTag/>
属性被完全忽略。 但设置一个空白区域,如下所示:
<MyTag th:attr="Description=${person.getEnum()!=null} ? ${#objects.nullSafe(person.getEnum().getDescription(),' ')} : '',Id=${person.getEnum()()!=null} ? ${#objects.nullSafe(person.getEnum()().getId(),'')} : ' '"/>
将产生以下结果:
< MyTag Desciption=" " Id=" "/>
如果没有那个空白区域,我怎样才能达到第一个提到的结果?
最佳答案
更新:
Thymeleaf if
方法不适用于 OP 的情况。因此,我可以建议的唯一其他方法是使用 JavaScript(在本例中为 jQuery):
假设除了需要的其他内容之外,还可以为 MyTag
指定一个类:
<MyTag class="myClass"...></MyTag>
然后使用基本的 Thymeleaf - 不要尝试考虑空值。
然后使用 jQuery 来“填补属性空白,对于相关属性还没有值的情况 - 例如:
<script>
$(document).ready(function () {
$( ".myClass" ).each(function() {
if ( ! $( this ).attr("Description") ) {
$( this ).attr("Desciption", "");
}
});
});
</script>
这样,DOM 将包含如下属性:
<MyTag class="myClass" Description="" ...></MyTag>
这可以根据需要扩展以涵盖其他属性。
原始方法 - OP 无法使用:
我知道如何使用 Thymeleaf 执行此操作的唯一方法:
如果是“全有或全无”的情况(即,如果您要使用的所有属性均为 null,或者它们都不为 null),请使用 if
回退到常规 HTML .
这就是问题中的情况 - 所以也许这就是您所需要的。
示例:
从一个包含 3 个字段的简单 Name
bean 开始:第一个、中间和最后一个,我们有以下数据:
Map<String, Object> model = new HashMap();
List<Name> names = new ArrayList();
names.add(new Name("John", "Jack", "Smith"));
names.add(new Name("Fred", null, "Jones"));
model.put("names", names);
ctx.render("names.html", model);
使用以下 Thymeleaf...
<th:block th:each="name : ${names}">
<th:block th:if="${name.middle} == null">
<div middle=""
th:text="${name.first} + ' ' + ${name.last}">
</div>
</th:block>
<th:block th:if="${name.middle} != null">
<div th:attr="middle=${name.middle}"
th:text="${name.first} + ' ' + ${name.last}">
</div>
</th:block>
</th:block>
...我们得到结果 HTML:
<div middle="Jack">John Smith</div>
<div middle="">Fred Jones</div>
当然,如上所述,这不是特别灵活。例如,jQuery 的 .attr()
方法会针对缺少的属性返回 undefined
。
旁注:
您可以替换它:
th:attr="middle=${name.middle}"
这样:
th:middle="${name.middle}"
它会给你相同的最终结果。
最后一点:
同样,与您的问题没有直接关系,但是...我会对没有值的“id”属性持谨慎态度。使用唯一值,或者不要使用“id”属性。
关于java - 无法将空字符串设置为 thymeleaf 中的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61460426/