【问题标题】:How to use Kotlin's `is` operator in SpEL expression?如何在 SpEL 表达式中使用 Kotlin 的 `is` 运算符?
【发布时间】:2022-04-09 06:36:38
【问题描述】:

我有一个简单的密封类

sealed class Target {
    class User(val id: Long) : Target()
    class City(val id: String) : Target()
}

用作s Spring bean方法的参数。我想仅当参数为User 时,有条件地通过@Cacheable 缓存该方法。

@Cacheable(CACHE_NAME, condition = "#target is Target.User")
open fun getFeed(target: Target): Map<String, Any?> { ... }

但是我得到一个错误:'(' or &lt;operator&gt; expected, got 'is'

如何在条件字符串中使用is

【问题讨论】:

    标签: spring kotlin


    【解决方案1】:

    感谢Raphael's answer我才知道

    1. 不是 Kotlin 的 is,而是 Java 的 instanceof
    2. SpEL has a special syntax 用于使用 instanceof,您需要在类周围使用包装器:filterObject instanceof T(YourClass)
    3. fully qualified class name must be used 用于除 java.lang 之外的任何其他包中的类。
    4. 在运行时可用于在密封类的主体内定义的类的完全限定名称是&lt;package&gt;.&lt;SealedClass&gt;$&lt;SubClass&gt;。就我而言,它是net.goout.feed.model.Target$User

    把所有这些放在一起就产生了这个SpEL

    #target instanceof T(net.goout.feed.model.Target$User)
    

    【讨论】:

      【解决方案2】:

      据我所知,SpEL 是基于 java 的,而 Java 没有名为“is”的运算符。 'is' 的 Java 等价物是 'instanceof'。由于 Java 和 Kotlin 是可互操作的,并且您可以在 Java 上下文中使用 Kotlin 类,所以#target instanceof FeedTarget.User 应该可以正常工作。

      【讨论】:

      • 非常感谢您的回答!您为我指出了正确的方向,但是工作解决方案需要更多的挖掘。看我的回答。 .)
      猜你喜欢
      • 2020-03-03
      • 2020-06-22
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多