java - 无法将空字符串设置为 thymeleaf 中的属性值

标签 java thymeleaf

我正在将一个 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/

相关文章:

java - 使用反射更改字符串的效果

java - 在java中使用通用数学库

java - "readonly if parameter"在 thymeleaf 中不起作用

spring-mvc - 如果是,则为:each statement in Thymeleaf

java - 将值从 thymeleaf 发送到 Spring Boot 服务类

java - 在 thymeleaf 中为变量名设置值

java - sql查询中的这个占位符是什么?

java - 我的 web 应用程序在 context.xml 中找不到 beans

Java:printf 堆栈错误

java - Spring AnnotationFormatterFactory 与 Thymeleaf th :text, 仅在字段显式为字符串时格式化