当前位置: 首页 > 知识库问答 >
问题:

Scala集合支持SpringEL/Thymeleaf

蔺劲
2023-03-14

我试图将Thymeleaf视图与Scala结合使用。我有一个用户实体,拥有一组电子邮件,我想在Thymeleaf模板中访问这些电子邮件:

在用户中。斯卡拉

case class User (@BeanProperty val emails: scala.immutable.List[String])

在一些模板中。html

<div th:text="${user.emails[0]}">...</div>

问题是Spring表达式求值器(Thymeleaf将表达式求值任务委托给它)只理解Java集合类型,因此试图获取Scala列表的第一个元素([0])/>)失败,出现异常。

我试图深入SpEL源代码,找到一个可以添加Java到Scala转换的地方。似乎如果我可以截取对的调用,并在从该方法返回时执行转换,那么它可能会工作。

但是我找不到拦截这些电话的方法。我想过用代理包装这些属性访问器实例,但是它们的初始化代码被硬编码到Thymeleaf的SpelExpression评估器SpelVariableExpression评估器SpelEvalue ationContext'类中,所以我没有明显的地方可以放入包装器。

在不重写太多的Thymeleaf和SpEL代码的情况下,是否有任何或多或少优雅的方式来包装Thymeleaf中使用的属性访问器(或者更普遍地向Thymeleaf和/或SpEL添加Scala集合支持)?

提前谢谢你!


共有1个答案

公羊宇定
2023-03-14

您可以删除@BeanProperty,并为互操作性添加一个getter:

case class User(emails: List[String]) {
  def getEmails = JavaConversions.asJavaIterable(emails)
}

更优雅的是使用Scala EL解析器

最新消息

对于解析器:Thymeleaf/SpringEL中的某个地方,表达式解析器解析bean的属性:因此在您的示例中:

${user.emails[0]}

它可能使用反射来查看user对象中是否存在getter方法getEmails。在这里,您可以添加与链接的Scala EL解析器中相同的代码:如果getter返回Scala集合,请在之前将其包装在Java iterable中(或将其转换为数组)。

 类似资料:
  • Scala提供了一套很好的集合实现,提供了一些集合类型的抽象。 Scala 集合分为可变的和不可变的集合。 可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。 而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。 接下来我们将为大家介绍几种常用集合类型的应用:

  • Scala 集合 Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的。 Scala 集合分为可变的和不可变的集合。 默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包。 默认引用 scala.collection.immutable.Set,不可变集合实例如下: val set = Set(1

  • Scala提供了一套很好的集合实现,提供了一些集合类型的抽象。 Scala 集合分为可变的和不可变的集合。 可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。 而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。 接下来我们将为大家介绍几种常用集合类型的应用:

  • 问题内容: 问题 与新HashSet(Collection)等效的Scala)相关,如何将Java集合(例如)转换为Scala集合? 我实际上是在尝试将Java API调用转换为Spring的 (返回a )成Scala不可变。因此,例如: 这似乎有效。欢迎批评! 问题答案: 您的最后一条建议有效,但您也可以避免使用: 请注意,默认情况下,由于提供了此功能。

  • 本文向大家介绍Scala将Scala集合转换为Java集合,反之亦然,包括了Scala将Scala集合转换为Java集合,反之亦然的使用技巧和注意事项,需要的朋友参考一下 示例 当您需要将集合传递到Java方法中时: 如果Java代码返回Java集合,则可以通过类似的方式将其转换为Scala集合: 请注意,这些是装饰器,因此它们仅将基础集合包装在Scala或Java集合接口中。因此,通话.asJa

  • 为了学习,我开发了一个Scala和JSF应用程序。在这个应用程序中,在JSF中呈现之前,我必须将所有Scala集合对象转换为Java cllectios。有没有什么简单的方法可以通过ScalaElResolver这样的东西来实现,如果有,任何人都有ScalaElResolver的示例代码。提前谢谢菲利普