Spring 中的嵌套 Thymeleaf 模板
Nested Thymeleaf Templates in Spring
短版
使用 Spring 时如何在 Thymeleaf 中制作嵌套模板?它在 Spring 的 th:object
属性中出现 asterisk notation is not supported ("*{mailingAddress}"
)。是否有解决方法/不同的标签可供使用?
长版
例如,假设我有这些 类:
class Address { String street; }
class Person { Address mailingAddress; Address shippingAddress; }
class Order { int orderNo; Person customer; }
所以我制作了一个 address.html
Thymeleaf 模板:
<span th:text="*{street}"></span>
我们用样本 Address
对其进行了测试。看起来不错。
然后我制作了一个 person.html
Thymeleaf 模板,它引用了如下地址:
<span th:text="*{firstName}"></span>
<span th:object="${person.shippingAddress}">
<span th:include="fragments/address :: address"></span>
</span>
我们用一个例子来测试它。我什至可以引用相同的模板并将上下文设置为 ${person.mailingAddress}
。到目前为止一切顺利。
现在让我们制作 Order
模板。只是,嘿,等等。早些时候,在我们的 person.html
文件中我们说 ${person.shippingAddress}
但 现在 我们需要它说 ${order.customer.shippingAddress}
。 If I were not using Spring 我将以下内容放入 person.html
:
<span th:text="*{firstName}"></span>
<span th:object="*{shippingAddress}">
<span th:include="fragments/address :: address"></span>
</span>
这样一来,无论我到达这里的路径是什么,我都需要关心的是我当前的上下文有一个 shippingAddress
。然后我可以直接使用 person.html
以及在我的 order.html
模板中使用。
不幸的是我是在Spring,所以我得到以下异常:
org.thymeleaf.exceptions.TemplateProcessingException:
The expression used for object selection is *{shippingAddress},
which is not valid: only variable expressions (${...}) are
allowed in 'th:object' attributes in Spring-enabled environments.
(include:510)
at org.thymeleaf.spring4.processor.attr.SpringObjectAttrProcessor.validateSelectionValue(SpringObjectAttrProcessor.java:73)
at org.thymeleaf.standard.processor.attr.AbstractStandardSelectionAttrProcessor.getNewSelectionTarget(AbstractStandardSelectionAttrProcessor.java:69)
at org.thymeleaf.processor.attr.AbstractSelectionTargetAttrProcessor.processAttribute(AbstractSelectionTargetAttrProcessor.java:61)
为了继续前进,我必须复制所有嵌套模板。在这个例子中,我将有一个 person.html
和 th:object="${person.mailingAddress}"
调用 address.html
,还有一个 person.html
的副本调用 orderCustomer.html
,我们将行更改为 th:object="${order.customer.mailingAddress}"
,但在其他方面完全相同。
是否有可以让我重新使用模板的解决方法?
您可以在 github 中向 thymeleaf 开发人员报告错误,或者分叉项目以添加此功能并说服 Daniel Fernández 接受它。
https://github.com/thymeleaf/thymeleaf/issues
否则,他在 Whosebug 中可用。您可以简单地向他发送有关集成此功能的可能性的消息
https://whosebug.com/users/550664/daniel-fern%C3%A1ndez
除此之外,我们无能为力,只能坚持将 th:object="${person.mailingAddress}"
和 th:object="${order.customer.mailingAddress}"
放在每次导入之外的方法。
短版
使用 Spring 时如何在 Thymeleaf 中制作嵌套模板?它在 Spring 的 th:object
属性中出现 asterisk notation is not supported ("*{mailingAddress}"
)。是否有解决方法/不同的标签可供使用?
长版
例如,假设我有这些 类:
class Address { String street; }
class Person { Address mailingAddress; Address shippingAddress; }
class Order { int orderNo; Person customer; }
所以我制作了一个 address.html
Thymeleaf 模板:
<span th:text="*{street}"></span>
我们用样本 Address
对其进行了测试。看起来不错。
然后我制作了一个 person.html
Thymeleaf 模板,它引用了如下地址:
<span th:text="*{firstName}"></span>
<span th:object="${person.shippingAddress}">
<span th:include="fragments/address :: address"></span>
</span>
我们用一个例子来测试它。我什至可以引用相同的模板并将上下文设置为 ${person.mailingAddress}
。到目前为止一切顺利。
现在让我们制作 Order
模板。只是,嘿,等等。早些时候,在我们的 person.html
文件中我们说 ${person.shippingAddress}
但 现在 我们需要它说 ${order.customer.shippingAddress}
。 If I were not using Spring 我将以下内容放入 person.html
:
<span th:text="*{firstName}"></span>
<span th:object="*{shippingAddress}">
<span th:include="fragments/address :: address"></span>
</span>
这样一来,无论我到达这里的路径是什么,我都需要关心的是我当前的上下文有一个 shippingAddress
。然后我可以直接使用 person.html
以及在我的 order.html
模板中使用。
不幸的是我是在Spring,所以我得到以下异常:
org.thymeleaf.exceptions.TemplateProcessingException:
The expression used for object selection is *{shippingAddress},
which is not valid: only variable expressions (${...}) are
allowed in 'th:object' attributes in Spring-enabled environments.
(include:510)
at org.thymeleaf.spring4.processor.attr.SpringObjectAttrProcessor.validateSelectionValue(SpringObjectAttrProcessor.java:73)
at org.thymeleaf.standard.processor.attr.AbstractStandardSelectionAttrProcessor.getNewSelectionTarget(AbstractStandardSelectionAttrProcessor.java:69)
at org.thymeleaf.processor.attr.AbstractSelectionTargetAttrProcessor.processAttribute(AbstractSelectionTargetAttrProcessor.java:61)
为了继续前进,我必须复制所有嵌套模板。在这个例子中,我将有一个 person.html
和 th:object="${person.mailingAddress}"
调用 address.html
,还有一个 person.html
的副本调用 orderCustomer.html
,我们将行更改为 th:object="${order.customer.mailingAddress}"
,但在其他方面完全相同。
是否有可以让我重新使用模板的解决方法?
您可以在 github 中向 thymeleaf 开发人员报告错误,或者分叉项目以添加此功能并说服 Daniel Fernández 接受它。
https://github.com/thymeleaf/thymeleaf/issues
否则,他在 Whosebug 中可用。您可以简单地向他发送有关集成此功能的可能性的消息
https://whosebug.com/users/550664/daniel-fern%C3%A1ndez
除此之外,我们无能为力,只能坚持将 th:object="${person.mailingAddress}"
和 th:object="${order.customer.mailingAddress}"
放在每次导入之外的方法。