首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在graphql tools Resolver中@Autowire存储库

如何在graphql tools Resolver中@Autowire存储库
EN

Stack Overflow用户
提问于 2020-02-26 16:02:38
回答 1查看 487关注 0票数 0

我在Kotlin中使用Spring和库。当我向我的应用程序发送一个查询时,它会抛出以下内容:

代码语言:javascript
复制
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]

这是我的解决方案:

代码语言:javascript
复制
@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
    ))
}

这是一个实体:

代码语言:javascript
复制
@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

这是输入类型类:

代码语言:javascript
复制
data class UserInput(
        var email: String,
        var nick: String
)

这是存储库:

代码语言:javascript
复制
@Repository
@Component
interface UserRepository : JpaRepository<User, String>

这是主要的课程:

代码语言:javascript
复制
@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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-26 19:00:18

你能在UserRepository组件(而不是GraphQL组件)中自动定位吗?

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

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

这将指示Spring扫描MinerepoApplication类包(和子包)以查找JPA存储库。

您不需要JPA存储库接口上的注释@Repository@Component。此外,@Repository的工作方式类似于@Component

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

代码语言:javascript
复制
@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
    ))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60417938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档