【问题标题】:Kotlin, Java, JSTL Boolean interopKotlin、Java、JSTL 布尔互操作
【发布时间】:2018-06-18 14:45:16
【问题描述】:

我对 JSTL 和 Kotlin 互操作有疑问。

我有一个带有 2 个 kotlin 布尔字段的特殊 kotlin 类。

class Foo {
    var isBar1 : Boolean = false
    var isBar2 : Boolean = false

    constructor()

    constructor(isBar1: Boolean, isBar2: Boolean) {
        this.isBar1 = isBar1
        this.isBar2 = isBar2
    }
}

我必须通过以下方式从 jsp 访问这两个字段:

<c:choose>
     <c:when test="${foo.isBar1== true}">
          <p>Print something</p>
     </c:when>

     <c:when test="${foo.isBar1== false}">
          <p>Print something else</p>
     </c:when>
</c:choose>

与 isBar2 完全相同

问题是,当我运行这段代码时 我遇到了

java.lang.NoSuchMethodError: packagedeclaration.setBar1(Ljava/lang/Boolean;)V

如果我尝试编写以下函数:

fun getBar1(): Boolean {
    return this.isBar1
}

fun setBar1(isBar1: Boolean): Any {
    this.isBar1= isActive
    return Any()
}

fun getBar2(): Boolean {
    return this.isBar2
}

fun setBar2(isBar2: Boolean): Any {
    this.isBar2= isBar2
    return Any()
}

它会带我去 “javax.el.PropertyNotFoundException:在类型 [packagedeclaration.foo] 上找不到属性 [isBar2]”

我尝试将字段设置为私有,但没有帮助。 Java boolean 作为参数似乎无法传递,因为 IntelliJ 不断地用不同的错误轰炸我。

这是我的想法: JSTL 尝试使用 java 布尔参数和返回类型访问 java getter/setter。 Jstl 寻找用 java 命名约定命名的方法,所以 getBar1 和 setBar1 但 kotlin 生成 isBar1 和 setBar1

Java - 根据此 kotlin 参考页面,布尔值的 Kotlin 互操作是布尔值: Kotlin- Java interop reference

你知道如何解决这个问题吗?

【问题讨论】:

  • 尝试不使用“is”${foo.bar1== true} 以获得适当的匹配。
  • 请看一下这个答案stackoverflow.com/questions/43317026/…,看看它是否对您有任何帮助。您可能需要使用 java getter 在 JSP 模板中进行检查。
  • @GurkanYesilyurt 感谢您的建议。遗憾的是,这并没有解决问题。 NoSuchMethodExc 带或不带自定义设置器(以及私有/默认可见性修饰符)
  • 在布尔值中,EL 也会为${foo.bar1} 寻找isBar1() getter 方法。也许你有 JSTL lib 问题。请删除页面顶部的所有 JSTL 标记和标记库定义。只需尝试使用 EL ${foo.bar1} 来检查它是否被正确调用。
  • 就是这样。谢谢

标签: java jsp intellij-idea kotlin jstl


【解决方案1】:

在布尔值中,EL 也会为表达式${foo.bar1} 寻找isBar1() getter 方法。可能,您有 JSTL lib 问题。请删除页面顶部的所有 JSTL 库和标签库定义。只需尝试使用 EL ${foo.bar1} 来检查它是否被正确调用。

【讨论】:

    【解决方案2】:

    您可以在这里使用 Kotlin 的 data class 功能,

    试试下面

    data class Foo(val isBar1:Boolean= false,val isBar2:Boolean= false)
    

    【讨论】:

    • 我使用了 Gurkan Yesilyurt 解决方案,它解决了问题
    猜你喜欢
    • 2020-06-21
    • 2015-03-27
    • 2015-12-12
    • 2023-04-10
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多