我最初使用Java。今天我将我的Java代码转换为Kotlin代码,并且发生了错误。当我提交表单时,Thymeleaf显示Invalid property 'details[0]' of bean class [org.example.website.model.Record]
并且调试控制台告诉我从Record.getDetails
抛出了KotlinNullPointerException。我在getter中设置了一个断点,并发现我提交的对象与我设置为Model&#39s的属性的对象不同。对象的details属性为null
希望这个问题能够得到解决。非常感谢。
实体类:
@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
}
控制器:
@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>
答案 0 :(得分:1)
问题是你要将字段初始化为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
。