科特林 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更改为Java。
- 存储一个不同的对象而不是 org.springframework.security.oauth2.core.OAuth2AccessToken class
关于如何解决这个问题还有什么想法吗?
这是我在数据库中的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> {
}
我只是在做一个:
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 都会为您提供一个空构造函数(无参数)并且其中没有主体。
您的问题可能是以下之一:
- 空的构造函数是私有的,因此对试图创建实例的代码不可见
- 它只是没有一个空的构造函数。已经有其他构造函数,但未指定 "empty" 构造函数。这可能是 Karol Dowbecki 提到的
- 它是指定的,但它是私有的,因此我们回到第 1 点。
A data
class 应该对此没有影响。 数据 classes 只负责用支持字段包装属性并为您提供 getter 和 setter 感谢 Alexey 的更正。 Kotlin 对所有属性都这样做。除此之外,他们编写了 toString
、equals
和 hashCode
方法的实现,并添加了一个很好的方法来生成名为 copy
的同一对象的副本
我终于更改了 OAuth2AccessToken class 并创建了一个自定义的:
data class DatabaseOauth2AccessToken(
val tokenValue: String,
val issuedAt: Instant?,
val expiredAt: Instant?,
val scopes: MutableSet<String>
)
据我所知,这是我找到的最可行的解决方案。
我正在使用 kotlin 将来自图书馆的 class 存储在数据库中。问题是这个 class 没有一个没有参数的构造函数(它是一个 Java class)。当我从数据库中检索对象时,出现以下错误,因为它没有构造函数:
java.lang.NoSuchMethodException: org.springframework.security.oauth2.core.OAuth2AccessToken.<init>()
我认为它将解决问题的唯一解决方案如下:
- 将我检索对象的class更改为Java。
- 存储一个不同的对象而不是 org.springframework.security.oauth2.core.OAuth2AccessToken class
关于如何解决这个问题还有什么想法吗?
这是我在数据库中的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> {
}
我只是在做一个:
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 都会为您提供一个空构造函数(无参数)并且其中没有主体。
您的问题可能是以下之一:
- 空的构造函数是私有的,因此对试图创建实例的代码不可见
- 它只是没有一个空的构造函数。已经有其他构造函数,但未指定 "empty" 构造函数。这可能是 Karol Dowbecki 提到的
- 它是指定的,但它是私有的,因此我们回到第 1 点。
A data
class 应该对此没有影响。 数据 classes 只负责用支持字段包装属性并为您提供 getter 和 setter 感谢 Alexey 的更正。 Kotlin 对所有属性都这样做。除此之外,他们编写了 toString
、equals
和 hashCode
方法的实现,并添加了一个很好的方法来生成名为 copy
我终于更改了 OAuth2AccessToken class 并创建了一个自定义的:
data class DatabaseOauth2AccessToken(
val tokenValue: String,
val issuedAt: Instant?,
val expiredAt: Instant?,
val scopes: MutableSet<String>
)
据我所知,这是我找到的最可行的解决方案。