Thymeleaf提交表单导致KotlinNullPointerException

时间:2018-02-12 19:40:15

标签: spring-mvc spring-boot kotlin thymeleaf

我最初使用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>

1 个答案:

答案 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