gpt4 book ai didi

java - 如何在 graphql-java-tools Resolver 中 @Autowire JPA 存储库

转载 作者:行者123 更新时间:2023-12-01 18:13:35 24 4
gpt4 key购买 nike

我将 Spring JPA 和 GraphQL-Java-Kickstart 库集与 Kotlin 一起使用。当我向我的应用程序发送查询时,它会抛出以下错误:

2020-02-26 18:51:42.707 ERROR 2672 --- [nio-8080-exec-7] g.k.e.error.DefaultGraphQLErrorHandler   : Error executing query Exception while fetching data (/createUser) : lateinit property userRepository has not been initialized

kotlin.UninitializedPropertyAccessException: lateinit property userRepository has not been initialized
at com.minerepo.minerepo.resolver.mutation.RootMutationResolver.createUser(RootMutationResolver.kt:16) ~[main/:na]

这是我的解析器:

@Component
class RootMutationResolver : GraphQLMutationResolver {
@Autowired
private lateinit var userRepository: UserRepository

fun createUser(user: UserInput): User = userRepository.save(User(
id = UUID.randomUUID().toString(),
email = user.email,
nick = user.nick
))
}

这是一个实体:

@Entity
data class User(
@Id val id: String,
@NotNull @Email var email: String,
@NotBlank @Length(min=4, max=64) var nick: String
) : ProjectOwner // Table-per-class inheritance

这是输入类型类:

data class UserInput(
var email: String,
var nick: String
)

这是存储库:

@Repository
@Component
interface UserRepository : JpaRepository<User, String>

这是主类:

@SpringBootApplication
class MinerepoApplication {
@Bean
fun schema() : GraphQLSchema = SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(RootQueryResolver(), RootMutationResolver())
.build()
.makeExecutableSchema()
}

fun main(args: Array<String>) {
runApplication<MinerepoApplication>(*args)
}

最佳答案

您可以在另一个组件(不是 GraphQL 组件)中 Autowiring UserRepository 吗?

我认为您错过了 MinerepoApplication 类上的 @EnableJpaRepositories 注释。示例:

@SpringBootApplication
@EnableJpaRepositories(basePackageClasses = [MinerepoApplication::class])
class MinerepoApplication {
@Bean
fun schema() : GraphQLSchema = SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(RootQueryResolver(), RootMutationResolver())
.build()
.makeExecutableSchema()
}

这将指示 Spring Data 扫描 MinerepoApplication 类包(和子包)中的 JPA 存储库。

您不需要注释@Repository并且JPA 存储库接口(interface)上的 @Component。此外,@Repository 也可以像 @Component 一样工作。

我还想补充一点,当你在组件中注入(inject)必要的依赖项时,你不应该在字段上使用@Autowired,你应该通过构造函数注入(inject)它们。示例:

@Component
class RootMutationResolver(
private val userRepository: UserRepository
) : GraphQLMutationResolver {

fun createUser(user: UserInput): User = userRepository.save(User(
id = UUID.randomUUID().toString(),
email = user.email,
nick = user.nick
))
}

关于java - 如何在 graphql-java-tools Resolver 中 @Autowire JPA 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60417938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com