Kotlin java.lang.NoSuchMethodException:<;初始化>;()

Kotlin java.lang.NoSuchMethodException:<;初始化>;(),java,kotlin,instantiation,Java,Kotlin,Instantiation,我正在使用kotlin在数据库中存储库中的类。问题是这个类没有一个没有参数的构造函数(它是一个Java类)。当我从数据库检索对象时,我得到以下错误,因为它没有构造函数: java.lang.NoSuchMethodException: org.springframework.security.oauth2.core.OAuth2AccessToken.<init>() 这是存储库类: @Repository interface AuthorizedClientDatabaseRep

我正在使用kotlin在数据库中存储库中的类。问题是这个类没有一个没有参数的构造函数(它是一个Java类)。当我从数据库检索对象时,我得到以下错误,因为它没有构造函数:

java.lang.NoSuchMethodException: org.springframework.security.oauth2.core.OAuth2AccessToken.<init>()
这是存储库类:

@Repository
interface AuthorizedClientDatabaseRepository : MongoRepository<AuthorizedClientDatabase, ObjectId> {
}
类没有尝试调用的非参数构造函数。您需要更改代码以使用两个现有构造函数之一:

public OAuth2AccessToken(TokenType tokenType, String tokenValue, 
       Instant issuedAt, Instant expiresAt) {
   // ...       
}

公共OAuth2AccessToken(TokenType TokenType,String tokenValue, 即时发布日期、即时过期日期、设置范围){ // ... }
除了卡罗尔·道贝基的答案;如果您不以任何方式指定构造函数,那么所有类都会为您提供一个空构造函数(没有参数)和其中没有主体

您的问题可能是以下问题之一:

  • 空构造函数是私有的,因此对试图创建实例的代码位不可见
  • 它只是没有一个空的构造函数。已存在其他构造函数,但未指定“空”构造函数。这可能是卡罗尔·道贝基提到的
  • 它是指定的,但是私有的,因此我们回到第1点

  • 数据
    类应该对此没有影响。数据类只负责用一个支持字段包装属性,并为您提供getter和setter,感谢Alexey的纠正。Kotlin对所有属性都这样做。除此之外,他们还编写了
    toString
    equals
    hashCode
    方法的实现,并添加了一个很好的方法来生成同一对象的副本,名为
    copy

    我最后更改了OAuth2AccessToken类并创建了一个自定义类:

    data class DatabaseOauth2AccessToken(
        val tokenValue: String,
        val issuedAt: Instant?,
        val expiredAt: Instant?,
        val scopes: MutableSet<String>
    )
    
    数据类数据库OAuth2AccessToken(
    val-tokenValue:String,
    val发出日期:即时?,
    val expiredAt:即时?,
    val作用域:可变表集
    )
    

    好的,这是我找到的最可行的解决方案。

    您使用的是
    数据类吗?是的,我使用的是数据类所有类都至少有一个构造函数。显示您的代码以说明问题。我已经用类更新了问题数据库中的文档是什么样子的?“数据类应该对此没有影响。”Kotlin中的数据类要求至少有一个主构造函数参数,因此,总是有一个带参数的构造函数,而不添加默认构造函数。“数据类只是负责用一个支持字段包装属性,并为您提供getter和setter。”这完全是错误的;属性本身负责为您提供getter和setter,并在默认情况下使用支持字段,
    数据类
    。抱歉,Alexey,您是对的。我想说的是,它们还提供了与数据类的属性相关的复制方法,而我完全没有
    public OAuth2AccessToken(TokenType tokenType, String tokenValue, 
           Instant issuedAt, Instant expiresAt) {
       // ...       
    }
    
    public OAuth2AccessToken(TokenType tokenType, String tokenValue, 
            Instant issuedAt, Instant expiresAt, Set<String> scopes) {
       // ...
    }
    
    data class DatabaseOauth2AccessToken(
        val tokenValue: String,
        val issuedAt: Instant?,
        val expiredAt: Instant?,
        val scopes: MutableSet<String>
    )