grpahiql не использует путь контекста приложения для / graphql

Я разработал приложение с использованием фреймворка graphql с spqr, и ниже приведены зависимости. У моего весеннего загрузочного приложения есть контекстный путь, например server.servlet-path = / asdfg

    <dependency>
        <groupId>io.leangen.graphql</groupId>
        <artifactId>spqr</artifactId>
        <version>0.9.7</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>4.2.0<</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-java-tools</artifactId>
        <version>5.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphiql-spring-boot-starter</artifactId>
        <version>4.2.0<</version>
    </dependency>

Приложение представляет собой приложение Java / Spring Boot, где моей конечной точкой является PersonQuery, как показано здесь.

@Component
public class PersonQuery {
    @GraphQLQuery(name = "getPersons")
    public List<Person> getFirstNPersons(@GraphQLArgument(name = "count") int count){
        List<Person> result = new ArrayList<>();
        ...
        return result.stream().limit(count).collect(Collectors.toList());
    }
}

Теперь при запуске приложения я загружаю personQuery и затем создаю схему. (Я использую spqr, и нет файла .graphqls с определениями типов, но они аннотированы, как вы можете выше) с классом @RestController.

@RestController
public class GraphQLController {
    private static final Logger LOGGER = LoggerFactory.getLogger(GraphQLController.class);
    private final GraphQL graphQL;
    @Autowired
    public GraphQLController(PersonQuery personQuery) {
        // Schema generated from query classes
        GraphQLSchema schema = new GraphQLSchemaGenerator().withResolverBuilders(
                // Resolve by annotations
                new AnnotatedResolverBuilder(),
                // Resolve public methods inside root package
                new PublicResolverBuilder("com.xyz.asd.services"))
                // Query Resolvers
                .withOperationsFromSingleton(personQuery)
                .withValueMapperFactory(new JacksonValueMapperFactory()).generate();
        graphQL = GraphQL.newGraphQL(schema).build();
    }

    @PostMapping(value = "/graphql", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ResponseBody
    public Map<String, Object> indexFromAnnotated(@RequestBody Map<String, String> request, HttpServletRequest raw) {
        ExecutionResult executionResult = graphQL.execute(ExecutionInput.newExecutionInput().query(request.get("query"))
                .operationName(request.get("operationName")).context(raw).build());
        return executionResult.toSpecification();
    }

Приведенного выше кода достаточно, чтобы вызвать http://localhost:8080/asdfg/graphiql, где " asdfg "- это путь к контексту моего приложения. Но в пользовательском интерфейсе graphIQL я не мог увидеть схему в документации, как это обычно показано. Причина, по которой я обнаружил, заключается в том, что пользовательский интерфейс graphIQL выполняет вызов POST с помощью / graphql, он не добавляет контекст в путь. Это POST http://localhost:8080/graphql вместо POST http://localhost:8080/asdfg/graphql.

Если я удалю контекстный путь из приложения Spring, приложение будет работать нормально. Есть ли способ включить контекстный путь в вызов POST http://localhost:8080/graphql?


person Pearl Matt    schedule 18.06.2018    source источник
comment
Не могли бы вы подробнее рассказать, в чем вам нужна помощь? Не могли бы вы подробнее рассказать о своем вопросе?   -  person maxpaj    schedule 18.06.2018
comment
Спасибо. Я обновил исходную ветку, добавив больше фрагментов кода и деталей.   -  person Pearl Matt    schedule 19.06.2018


Ответы (1)


Может стоит поменять свой *.graphqls файл?

mapping: /graphql --> mapping: /graphql

Из:

graphql:
  servlet:
    mapping: /graphql

To:

graphql:
      servlet:
        mapping: /asdfg/graphql
person tore gard andersen    schedule 28.06.2020