私はspqrでgraphqlフレームワークを使用してアプリケーションを開発しました。依存関係は以下のとおりです。私のスプリング ブート アプリケーションには、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>
アプリケーションは、私のエンドポイントが PersonQuery である Java/Spring Boot アプリケーションです - ここに示されています
@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 UI では、通常のようにドキュメントの下にスキーマが表示されませんでした。私が見つけた理由は、graphIQL UI が /graphql で POST 呼び出しを行いますが、パスにコンテキストを追加していないためです。つまり、 POST http://localhost:8080/asdfg/graphqlではなく POST http://localhost:8080/graphqlです。
Spring アプリケーションからコンテキスト パスを削除すると、アプリケーションは正常に動作します。POST http://localhost:8080/graphql呼び出しにコンテキスト パスを含める方法はありますか?