科特林 java.lang.NoSuchMethodException: <init>()

Kotlin java.lang.NoSuchMethodException: <init>()

我正在使用 kotlin 将来自图书馆的 class 存储在数据库中。问题是这个 class 没有一个没有参数的构造函数(它是一个 Java class)。当我从数据库中检索对象时,出现以下错误,因为它没有构造函数:

java.lang.NoSuchMethodException: org.springframework.security.oauth2.core.OAuth2AccessToken.<init>()

我认为它将解决问题的唯一解决方案如下:

关于如何解决这个问题还有什么想法吗?

这是我在数据库中的class:

@Document(collection = "authorizedClient")
data class AuthorizedClientDatabase(
    @Id
    var id: ObjectId = ObjectId.get(),
    var name: String? = null,
    var clientRegistration: ClientRegistration,
    var accessToken: OAuth2AccessToken,
    var refreshToken: OAuth2RefreshToken? = null
)

这是存储库 class:

@Repository
interface AuthorizedClientDatabaseRepository : MongoRepository<AuthorizedClientDatabase, ObjectId> {
}

这是OAuth2AccessToken

我只是在做一个:

authorizedClientDatabaseRepository.findById(...)

OAuth2AccessToken class 没有您尝试调用的非参数构造函数。您需要更改代码以使用两个现有构造函数之一:

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

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

除了 Karol Dowbecki 的回答;如果您不以任何方式指定构造函数,所有 classes 都会为您提供一个空构造函数(无参数)并且其中没有主体。

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

  1. 空的构造函数是私有的,因此对试图创建实例的代码不可见
  2. 它只是没有一个空的构造函数。已经有其他构造函数,但未指定 "empty" 构造函数。这可能是 Karol Dowbecki 提到的
  3. 它是指定的,但它是私有的,因此我们回到第 1 点。

A data class 应该对此没有影响。 数据 classes 只负责用支持字段包装属性并为您提供 getter 和 setter 感谢 Alexey 的更正。 Kotlin 对所有属性都这样做。除此之外,他们编写了 toStringequalshashCode 方法的实现,并添加了一个很好的方法来生成名为 copy

的同一对象的副本

我终于更改了 OAuth2AccessToken class 并创建了一个自定义的:

data class DatabaseOauth2AccessToken(
    val tokenValue: String,
    val issuedAt: Instant?,
    val expiredAt: Instant?,
    val scopes: MutableSet<String>
)

据我所知,这是我找到的最可行的解决方案。