英文:
Calling Java function with nullable variable from Kotlin not working in Spring Boot / Mongodb
问题
我正在尝试在Spring Boot和Kotlin中使用mongoTemplate和Criteria API(https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/query/Criteria.html)创建一个MongoDB查询。出于某种原因,当我尝试调用期望非空参数的方法时,代码正常工作。例如:
query.addCriteria(Criteria.where("age").lt(50))
正常工作。这是因为lt方法(请参阅上面的文档)期望非空参数,我猜是这个原因。然而,当我改为执行以下操作时:
query.addCriteria(Criteria.where("name").is("Bob"))
我得到了异常“Expecting an element”。我查看了文档,发现is方法期望一个可空参数,而不是非空参数,似乎这是导致引发异常和不引发异常的方法之间的模式(例如,gte()也不会引发异常)。
从Kotlin中如何使用is()方法,该方法是用Java编写的,期望一个可空参数?
英文:
I am trying to create a MongoDB query in Spring boot and Kotlin by using mongoTemplate and the Criteria API (https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/query/Criteria.html) , which is written in Java. For some reason when I try to call a method that expects a non null parameter, the code works fine. For example:
query.addCriteria(Criteria.where("age").lt(50))
works fine. This is because the lt method (see documentation above) expects a non null parameter I am guessing. However, when I instead do
query.addCriteria(Criteria.where("name").is("Bob"))
I get the exception "Expecting an element" . I looked at the documentation and the is method expects a nullable parameter instead of a non null parameter, and this distinction seems to be the pattern between methods that cause an exception and those that don't (for example, gte() also doesn't cause an exception).
From Kotlin, how do I use the is() method, which is written in Java and expects a nullable parameter?
答案1
得分: 3
is
不是 Java 中的关键字,但在 Kotlin 中是关键字。is
是 Kotlin 中的类型检查运算符。
在 Kotlin 中,当你调用 is
时,应该使用反引号进行转义。
query.addCriteria(Criteria.where("name").`is`("Bob"))
根据语言规范:
Kotlin 支持将标识符括在反引号 (`) 字符中,允许将任何字符序列用作标识符。这不仅允许在名称中使用非字母数字字符(如 @ 或 #),还允许将关键字(如 if 或 when)用作标识符。
英文:
is
is not a keyword in Java, but it is in Kotlin. is
is the type-check operator in Kotlin.
You should escape is
with backticks when you are calling it in Kotlin.
query.addCriteria(Criteria.where("name").`is`("Bob"))
From the language spec:
> Kotlin supports escaping identifiers by enclosing any sequence of
> characters into backtick (`) characters, allowing to use any name as
> an identifier. This allows not only using non-alphanumeric characters
> (like @ or #) in names, but also using keywords like if or when as
> identifiers.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论