servlet graphql non avviato con graphql-java-tools (file schema non trovati?)

Sep 15 2020

Quindi, secondo graphql-java-kickstart / graphql-java-tools un endpoint 'graphql' dovrebbe diventare disponibile quando la dipendenza 'com.graphql-java-kickstart: graphql-spring-boot-starter' viene aggiunta al progetto e. I file dello schema graphqls vengono scansionati automaticamente.

Ho le seguenti dipendenze:

...
        <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>

Una definizione dello schema:

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

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

E un GraphQLQueryResolver per questo:

@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);
}

Secondo la documentazione:

Il servlet diventa accessibile in / graphql se graphql-spring-boot-starter è stato aggiunto come dipendenza a un'applicazione di avvio e nell'applicazione è presente un bean GraphQLSchema. Dai un'occhiata al semplice esempio per il minimo indispensabile.

Uno schema GraphQL può anche essere creato automaticamente quando una libreria di schemi graphql-java supportata viene trovata sul classpath.

La libreria graphql-java-tools dovrebbe creare automaticamente uno schema, in queste condizioni:

Tutti i bean GraphQLResolver e GraphQLScalar, insieme a un bean di tipo SchemaParserDictionary (per fornire tutte le altre classi), verranno utilizzati per creare un GraphQLSchema. Qualsiasi file sul classpath denominato * .graphqls verrà utilizzato per fornire la definizione dello schema. Vedere il file Leggimi per ulteriori informazioni.

Penso di avere tutto ciò di cui ha bisogno, ma la navigazione verso localhost:8080/graphqldà un 404. NB: localhost:8080/graphiqlfunziona, ma non può caricare lo schema. Dice:

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

Cosa mi manca?

Risposte

d01berg Sep 17 2020 at 02:16

Apparentemente l'applicazione non riusciva a trovare alcun JpaRepositories, perché la classe di avviamento SpringBootApplication si trovava in com.package.some.app mentre i repository erano in com.package.some.domain.repository . Lo scanner dei componenti stava esaminando solo i componenti con il pacchetto com.package.som.app. *