gpt4 book ai didi

spring-mvc - Thymeleaf 提交表单导致 KotlinNullPointerException

转载 作者:行者123 更新时间:2023-12-02 13:38:47 26 4
gpt4 key购买 nike

我一开始用的是Java。今天我将我的 Java 代码转换为 Kotlin 代码并且发生了错误。当我提交表单时,Thymeleaf 显示 Invalid property 'details[0]' of bean class [org.example.website.model.Record]并且调试控制台告诉我从 Record.getDetails 抛出了 KotlinNullPointerException .我在getter中设置了断点,发现我提交的对象和我给Model的Attribute设置的不一样。对象的 details 属性为空。
希望这个问题可以得到解决。非常感谢。

实体类:

@Entity
class Record {
@Id
@GeneratedValue
var id: Long? = null

@OneToMany(mappedBy = "record", cascade = arrayOf(CascadeType.ALL))
var details: List<Detail>? = null
get() {
return field!!.sortedBy { it.value }
}

var instruction: Long? = null
}

Controller :
@RequestMapping("/page")
fun page(model: Model): String {
// for form submission
val record = Record()
record.details = listOf(Detail(), Detail())
model.addAttribute("record", record)

return "page"
}
}

page.html
<form th:action="@{/handle}" th:object="${record}" method="post" class="form-inline">
<table class="table">
<tr th:each="detail, state: ${record.details}">
<td>
<input type="text" th:field="*{details[__${state.index}__].value}" required="" />
</td>
</tr>
</table>
<button class="btn btn-primary" type="submit">Finish</button>
<form>

最佳答案

问题是您正在将一个字段初始化为 null然后告诉 Kotlin 你知道它不为空(因为 !! 运算符)...

@OneToMany(mappedBy = "record", cascade = arrayOf(CascadeType.ALL))
var details: List<Detail>? = null
get() {
return field!!.sortedBy { it.value }
}

这就是说,定义一个名为 details 的字段作为一个可以为空的 List<Detail> , 最初初始化为 null .当有人调用 get() , 忽略对可能为空的 field 的空检查(即“详细信息”)并对值进行排序。

您可能需要这样的东西,而不是(未经测试):
@OneToMany(mappedBy = "record", cascade = arrayOf(CascadeType.ALL))
var details: List<Detail>? = null
get() {
return field?.sortedBy { it.value }
}

这将返回一个排序列表或 null .

关于spring-mvc - Thymeleaf 提交表单导致 KotlinNullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48754267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com