Добавление трассировки apollo в GraphQL Spring
Я пытаюсь построить сервер GraphQL, используя graphql-spring-boot-starter, и заинтересован в трассировке Apollo ( https://github.com/apollographql/apollo-tracing), которая добавляет дополнительные данные под ключ трассировки в расширениях.
После того, как я добавил инструмент трассировки, в моем ответе не было никаких изменений. Я что-то здесь упускаю?
запрос:
query getalllink{
allLinks(filter:{description_contains:"ab"}){
url,
postedBy {
id
,name
}
}
}
ответ:
{
"data": {
"allLinks": [
{
"url": "1a",
"postedBy": {
"id": "1",
"name": "1"
}
}
]
}
Я предоставил бин TracingInstrumentation. и bean-компонент, также полученный в GraphQLWebAutoConfiguration.
Я попытался отладить и достичь точки останова в GraphQLWebAutoConfiguration, инструментарий которой был добавлен в компонент GraphQLServlet.
Вот некоторая подробная информация о моем примере проекта:
@SpringBootApplication
public class DemographqlApplication {
public static void main(String[] args) {
SpringApplication.run(DemographqlApplication.class, args);
}
@Bean
Instrumentation instrumentation() {
return new TracingInstrumentation();
}
}
resources/graphql/schema.graphqls
schema {
query: Query
}
type Query {
allLinks: [Link]
}
type Link {
id: ID!
url: String!
description: String
postedBy: User
}
type User {
id: ID!
name: String!
}
Сущность и хранилище для User
а также Link
Resolver и Query Resolver:
@Component
public class LinkResolver implements GraphQLResolver<Link> {
@Autowired
private final UserRepository userRepository;
LinkResolver(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User postedBy(Link link) {
if (link.getUserId() == null) {
return null;
}
return userRepository.findOne(link.getUserId());
}
}
@Component
public class Query implements GraphQLQueryResolver {
private final LinkRepository linkRepository;
@Autowired
public Query(LinkRepository linkRepository) {
this.linkRepository = linkRepository;
}
public List<Link> allLinks() {
return linkRepository.findAll());
}
}
build.gradle
:
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile 'com.graphql-java:graphql-spring-boot-starter:3.10.0'
compile 'com.graphql-java:graphql-java-tools:4.3.0'
compile 'javax.xml.bind:jaxb-api:2.3.0'
compile 'com.h2database:h2'
// to embed GraphiQL tool
compile 'com.graphql-java:graphiql-spring-boot-starter:3.10.0'
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
// Use MySQL Connector-J
compile 'mysql:mysql-connector-java'
}
Спасибо.
1 ответ
Я столкнулся с той же проблемой сегодня. I opened the source code to understand what's wrong.
This issue is related to the version of graphql-java-servlet. Code snippet of GraphQLServlet.java for 4.6.0:
final ExecutionResult executionResult = newGraphQL(schema).execute(new ExecutionInput(query, operationName, context, rootObject, transformVariables(schema, query, variables)));
final List<GraphQLError> errors = executionResult.getErrors();
final Object data = executionResult.getData();
final String response = getMapper().writeValueAsString(createResultFromDataAndErrors(data, errors));
executionResult contains the extensions (executionResult#getExtensions) so TracingInstrumentation did the job. But as you can see the response takes into account only data and errors (but no extensions). That's why the tracing instrumentation values are not added to the response.
Если вы загляните в ветку мастера graphql-java-servlet ( https://github.com/graphql-java/graphql-java-servlet/blob/master/src/main/java/graphql/servlet/GraphQLServlet.java), вы увидите, что расширения принимаются во внимание. Я не знаю, была ли выпущена эта версия для Maven Central или нет.
В моем проекте я использовал graphql-spring-boot-starter 3.10.0, и я просто добавил правильную зависимость в моей конфигурации gradle:
compile "com.graphql-java:graphql-java-servlet:4.7.0"
Теперь это работает: я могу всю информацию трассировки в GraphiQL или лучше с GraphQL Plauyground 1.4.2
Надеюсь, поможет