Содержание
- Начало работы с GraphQl:Java
- 1. Добавьте зависимость maven
- 2. Создание GraphQL ObjectType и DataFetchers
- 3. Создайте еще один класс GraphQLConfig
- 4. Создайте модель класса GraphQLRequest
- 5. Создадим класс контроллера для обработки GraphQL-запросов (GraphQLController).
- Этот GraphQLController будет содержать в основном две конечные точки
- Теперь мы создали простое приложение Spring с GraphQL.
Начало работы с GraphQl:Java
1. Добавьте зависимость maven
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>16.2</version>
</dependency>
2. Создание GraphQL ObjectType и DataFetchers
- Определите GraphQLObjectType для пользователя, для этого я создаю класс, который поможет создавать различные типы и будет использоваться SchemaBuilderHelper.
import graphql.Scalars;
import graphql.schema.GraphQLObjectType;
import org.springframework.stereotype.Component;
@Component
public class MyGraphQLObjectTypes {
public GraphQLObjectType getUserType() {
return new GraphQLObjectType.Builder()
.name("User")
.field(builder ->
builder
.name("name")
.type(Scalars.GraphQLString)
)
.field(builder ->
builder
.name("email")
.type(Scalars.GraphQLString)
).build();
}
// define your own data type for your Model classes
}
Метод getUserType вернет GraphQLObjectType, который эквивалентен приведенному ниже классу user
import lombok.Data;
@Data
public class User {
private String name;
private String email;
}
- Теперь мы создадим в корневом запросе поле пользователя типа User, которое мы только что создали в предыдущем шаге
import graphql.Scalars;
import graphql.schema.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.HashMap;
@RequiredArgsConstructor
@Component
public class SchemaBuilderHelper {
private final MyGraphQLObjectTypes myGraphQLObjectTypes;
public void buildQuery(GraphQLObjectType.Builder queryBuilder, GraphQLCodeRegistry.Builder codeRegistry) {
queryBuilder.name("Query");
buildUserQuery(queryBuilder, codeRegistry);
}
private void buildUserQuery(GraphQLObjectType.Builder queryBuilder, GraphQLCodeRegistry.Builder codeRegistry) {
GraphQLObjectType userType = myGraphQLObjectTypes.getUserType();
codeRegistry.dataFetcher(FieldCoordinates.coordinates("Query", "user"), (DataFetcher<HashMap<String, Object>>) dataFetchingEnvironment -> {
HashMap<String, Object> res = new HashMap<>();
res.put("name", "Ram");
res.put("email", "Ram@gmail.com");
return res;
});
queryBuilder.field(builder -> builder
.name("user")
.type(userType));
}
}
Пока что я создал статический dataFetcher для пользователя (тип User), но его можно заменить динамическим источником данных.
3. Создайте еще один класс GraphQLConfig
Этот класс будет использовать SchemaBuilderHelper для построения GraphQLSchema и создания spring bean для нее, а также для
GraphQL, который используется для выполнения запросов graphQL.
import com.example.graphqljava.graphql.SchemaBuilderHelper;
import graphql.GraphQL;
import graphql.schema.GraphQLCodeRegistry;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.SchemaPrinter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GraphQLConfig {
@Bean
public SchemaPrinter getSchemaPrinter() {
return new SchemaPrinter();
}
@Bean
public GraphQLSchema getGraphQLSchema(SchemaBuilderHelper schemaBuilderHelper) {
GraphQLCodeRegistry.Builder codeRegistry = GraphQLCodeRegistry.newCodeRegistry();
GraphQLObjectType.Builder queryBuilder = GraphQLObjectType.newObject();
//build query type
schemaBuilderHelper.buildQuery(queryBuilder, codeRegistry);
return GraphQLSchema.newSchema()
.query(queryBuilder.build())
.codeRegistry(codeRegistry.build())
.build();
}
@Bean
public GraphQL getGraphQl(GraphQLSchema graphQLSchema) {
return GraphQL.newGraphQL(graphQLSchema).build();
}
}
4. Создайте модель класса GraphQLRequest
Он будет представлять graphQL-запрос, отправленный клиентом.
import lombok.Data;
@Data
public class GraphQLRequest {
private String query;
private String operationName;
private Map<String, Object> variables;
}
5. Создадим класс контроллера для обработки GraphQL-запросов (GraphQLController).
Этот GraphQLController будет содержать в основном две конечные точки
- POST конечная точка: для приема GraphQL запроса и возврата данных
- GET конечная точка : для возврата схемы GraphQL
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/graphql")
public class GraphQLController {
private final GraphQL graphQL;
private final GraphQLSchema schema;
private final SchemaPrinter schemaPrinter;
@GetMapping(produces = MediaType.TEXT_PLAIN_VALUE)
public String schema() {
return schemaPrinter.print(schema);
}
@PostMapping
public Object execute(@RequestBody GraphQLRequest graphQLRequest) {
Map<String, Object> variables = Optional.ofNullable(graphQLRequest.getVariables())
.orElse(new HashMap<>());
ExecutionInput input = new ExecutionInput
.Builder()
.query(graphQLRequest.getQuery())
.operationName(graphQLRequest.getOperationName())
.variables(variables).build();
ExecutionResult execute = graphQL.execute(input);
Map<String, Object> result = new HashMap<>();
result.put("data", execute.getData());
//set error if any
if (!execute.getErrors().isEmpty()) {
result.put("error", execute.getErrors());
}
return result;
}
}
Теперь мы создали простое приложение Spring с GraphQL.
Вот github repo для этого демо https://github.com/vijaypatidar/graph-ql-java