如何在 SpEL 表达式中使用 Kotlin 的 'is' 运算符?



我有一个简单的密封类

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 <operator> expected, got 'is'

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

多亏了Raphael的回答,我才发现

  1. 代替Kotlin的is的是Java的instanceof
  2. SpEL有一个使用instanceof的特殊语法,其中需要使用类的包装器:filterObject instanceof T(YourClass)
  3. 完全限定类名必须用于java.lang以外的任何其他包中的类
  4. 在运行时,在密封类的主体内定义的类的完全限定名称是<package>.<SealedClass>$<SubClass>。就我而言,它是net.goout.feed.model.Target$User

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

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

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

相关内容

最新更新