Таким образом, в соответствии с инструментами graphql-java-kickstart / graphql-java-tools конечная точка 'graphql' должна стать доступной, когда в проект добавляется зависимость 'com.graphql-java-kickstart: graphql-spring-boot-starter' и. Файлы схемы graphqls сканируются автоматически.

У меня следующие зависимости:

...
        <spring-boot.version>2.3.3.RELEASE</spring-boot.version>
        <graphql.version>7.0.1</graphql.version>
        <graphql-java-tools.version>6.2.0</graphql-java-tools.version>

...

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>

        <!-- graphql -->
        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphql-spring-boot-starter</artifactId>
            <version>${graphql.version}</version>
        </dependency>

        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphiql-spring-boot-starter</artifactId>
            <version>${graphql.version}</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphql-java-tools</artifactId>
            <version>${graphql-java-tools.version}</version>
        </dependency>

Определение схемы:

in query.graphqls:
type Query {
    user(username: String!)
    users: [User]
}

in user.graphqls:
type User {
    userId: Number!
    username: String!
}

И GraphQLQueryResolver для этого:

@Component
public class UserQueryResolver implements GraphQLQueryResolver {
    private final UserRepository userRepository;

    public UserQueryResolver(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public Iterable<User> users() {
        return this.userRepository.findAll();
    }

    public User user(String username) {
        return this.userRepository.findByUsername(username).orElseThrow();
    }
}

public interface UserRepository extends JpaRepository<User, Integer> {
    Optional<User> findByUsername(String username);
}

По документации:

Сервлет становится доступным в / graphql, если graphql-spring-boot-starter добавлен в качестве зависимости к загрузочному приложению и в приложении присутствует bean-компонент GraphQLSchema. Ознакомьтесь с простым примером для получения необходимого минимума.

Схема GraphQL также может быть создана автоматически, когда поддерживаемая библиотека схем graphql-java найдена в пути к классам.

Библиотека graphql-java-tools должна автоматически создать схему при следующих условиях:

Все bean-компоненты GraphQLResolver и GraphQLScalar вместе с bean-компонентом типа SchemaParserDictionary (для предоставления всех других классов) будут использоваться для создания GraphQLSchema. Любые файлы в пути к классам с именем * .graphqls будут использоваться для предоставления определения схемы. См. Readme для получения дополнительной информации.

Думаю, у меня есть все, что нужно, но переход к localhost:8080/graphql дает 404. Примечание: localhost:8080/graphiql работает, но не может загрузить схему. Он говорит:

{
  "timestamp": "2020-09-15T12:22:21.748+00:00",
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/graphql"
}

Что мне не хватает?

1
d01berg 15 Сен 2020 в 15:16

1 ответ

Лучший ответ

Очевидно, приложение не могло найти никаких JpaRepositories, потому что стартовый класс SpringBootApplication находился в com.package.some.app , а репозитории - в com.package.some.domain.repositories . Сканер компонентов сканировал только компоненты с пакетом com.package.som.app. *

0
d01berg 16 Сен 2020 в 19:16