Как @Autowire JPA-репозиторий в Graphql- java -tools Resolver - PullRequest
0 голосов
/ 26 февраля 2020

Я использую Spring JPA и GraphQL- Java -Кикстарт набора библиотек с 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)
}

1 Ответ

0 голосов
/ 26 февраля 2020

Можете ли вы автоматически связать UserRepository в другом компоненте (не в компоненте GraphQL)?

Я думаю, вы пропустили аннотацию @EnableJpaRepositories над классом MinerepoApplication. Пример:

@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 и @Component через интерфейс репозитория JPA. Кроме того, @Repository также работает как @Component.

Я также хотел бы добавить, что когда вы вводите необходимые зависимости в свои компоненты, вы не должны использовать @Autowired над полем, вы должны ввести их через конструктор. Пример:

@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
    ))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...