【发布时间】:2013-07-05 12:25:35
【问题描述】:
我正在尝试将Thymeleaf 视图与Scala 结合使用。
我有 User 实体和一组电子邮件,我想在 Thymeleaf 模板中访问这些电子邮件:
在 User.scala 中
case class User (@BeanProperty val emails: scala.immutable.List[String])
在 some-thymeleaf-template.html 中
<div th:text="${user.emails[0]}">...</div>
问题在于 Spring 表达式求值器(Thymeleaf 将表达式求值作业委托给它)仅理解 Java 集合类型,因此尝试获取 Scala 列表 (user.emails) 的第一个元素 ([0]) 失败一个例外。
我试图深入研究 SpEL 源代码,以找到一个可以添加 Java 到 Scala 转换的地方。似乎如果我可以拦截对org.springframework.expression.PropertyAccessor.read(..) 方法的调用并在从该方法返回时执行转换,它可能会起作用。
但我找不到拦截这些电话的方法。我考虑过用代理包装这些属性访问器实例,但它们的初始化代码被硬编码到 Thymeleaf 的 SpelExpressionEvaluator、SpelVariableExpressionEvaluator 和 SpelEvaluationContext'classes 中,因此我没有明显的地方可以放入我的包装器。
是否有任何或多或少优雅的方式来包装 Thymeleaf 中使用的属性访问器(或者更一般地向 Thymeleaf 和/或 SpEL 添加 Scala 集合支持)而不重写过多 Thymeleaf 和 SpEL 胆量?
提前谢谢你!
【问题讨论】:
标签: scala spring-el scala-java-interop thymeleaf