【问题标题】:Noarg constructor is not getting createdNoarg 构造函数没有被创建
【发布时间】:2018-07-15 20:39:22
【问题描述】:

我在我的Spring 应用程序中配置了kotlin-noarg 插件:

buildscript {
    ext {
        kotlinVersion = '1.2.51'
    }
    dependencies {
        // ...
        classpath "org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}"
    }
}

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: "kotlin-noarg"

noArg {
    annotation("com.example.demo.DefaultConstructor")
    invokeInitializers = true
}

然后我声明了我的注释:

package com.example.demo

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
annotation class DefaultConstructor

然后我有我的课:

@DefaultConstructor
data class UserForm(@field:NotNull
                    @field:DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") val dateTime: LocalDateTime)

这是我尝试使用UserForm 类的方式:

@GetMapping("")
public String userForm(UserForm userForm) {
    userForm.copy(LocalDateTime.now());
    return "/users/form";
}

所以Spring 在这里尝试使用反射初始化我的UserForm 类,但没有生成默认构造函数,尽管配置了kotlin-noarg 插件(我相信是正确的)。

问题出在哪里?是因为kotlin-noarg 插件配置错误吗?以及如何解决?

我创建了demo project

【问题讨论】:

    标签: spring spring-boot kotlin


    【解决方案1】:

    我不完全确定答案,但是:

    1. kotlin-noarg 提供语法构造函数(仅适用于反射)
    2. 如果 spring 尝试直接实例化 UserForm(不进行反射),它将失败。
    3. 有一种方法可以避免该问题。 标记UserForm@Entity 之后它将被识别为属于spring 的东西。在这个无参数构造函数之后,要么由kotlin-spring 插件生成,要么你需要添加kotlin-jpa 插件

    【讨论】:

      猜你喜欢
      • 2023-01-17
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多