我一开始用的是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/