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

标签 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的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/

相关文章:

java - 在 eclipse 之外将 Spring MVC 应用程序部署到 tomcat 的幕后会发生什么?

java - 为什么我的 Spring Boot Controller 不自动连接 validator ?

java - 理解字符串算法中的 "find maximum occuring char"

java - hibernate 使用 apache-poi 在外键字段中插入空值

java - 无法加载在 Docker 中运行的 Spring Boot 应用程序

Android Talkback 可访问性事件

android - 在 Android 中调用 Paypal 时无法获取访问 token

html - 我的页面太长。因此显示的错误超过了65535个字节的限制。请建议我解决我的问题

java - Spring框架上的多线程(或异步)计算

java - spring注释不起作用