我有一个简单的密封类
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的回答,我才发现
- 代替Kotlin的
is
的是Java的instanceof
- SpEL有一个使用
instanceof
的特殊语法,其中需要使用类的包装器:filterObject instanceof T(YourClass)
- 完全限定类名必须用于
java.lang
以外的任何其他包中的类 - 在运行时,在密封类的主体内定义的类的完全限定名称是
<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
应该可以正常工作。