diff --git a/graphql-modules/graphql-java/pom.xml b/graphql-modules/graphql-java/pom.xml index c5c5c578311c..6970d1e5cb0d 100644 --- a/graphql-modules/graphql-java/pom.xml +++ b/graphql-modules/graphql-java/pom.xml @@ -17,6 +17,12 @@ com.graphql-java graphql-java-annotations ${graphql-java-annotations.version} + + + com.graphql-java + graphql-java + + io.ratpack @@ -37,16 +43,34 @@ com.graphql-java graphql-java-tools ${graphql-java-tools.version} + + + com.graphql-java + graphql-java + + com.graphql-java graphql-java-servlet ${graphql-java-servlet.version} + + + com.graphql-java + graphql-java + + com.graphql-java-generator graphql-java-runtime ${graphql.java.generator.version} + + + com.graphql-java + graphql-java + + javax.servlet @@ -85,6 +109,12 @@ com.graphql-java graphql-java-extended-scalars ${graphql-java-extended-scalars.version} + + + com.graphql-java + graphql-java + + javax.ws.rs diff --git a/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/AnydataResponse.java b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/AnydataResponse.java new file mode 100644 index 000000000000..f151fc9eb630 --- /dev/null +++ b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/AnydataResponse.java @@ -0,0 +1,5 @@ +package com.baeldung.graphqlanydata; + +public interface AnydataResponse { + +} diff --git a/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/GraphQLConfig.java b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/GraphQLConfig.java new file mode 100644 index 000000000000..c88b19ff42dd --- /dev/null +++ b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/GraphQLConfig.java @@ -0,0 +1,47 @@ +package com.baeldung.graphqlanydata; + +import java.io.InputStreamReader; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import graphql.GraphQL; +import graphql.schema.GraphQLSchema; +import graphql.schema.idl.RuntimeWiring; +import graphql.schema.idl.SchemaGenerator; +import graphql.schema.idl.SchemaParser; +import graphql.schema.idl.TypeDefinitionRegistry; + +@Configuration +public class GraphQLConfig { + + @Bean + public GraphQL graphQL() { + SchemaParser schemaParser = new SchemaParser(); + SchemaGenerator schemaGenerator = new SchemaGenerator(); + + TypeDefinitionRegistry typeRegistry = schemaParser.parse( + new InputStreamReader(getClass().getResourceAsStream("/schema.graphqls")) + ); + + RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring() + .type("Mutation", builder -> + builder.dataFetcher("updateProfile", new MutationResolver().updateProfile()) + ) + .type("AnydataResponse", typeWiring -> + typeWiring.typeResolver(env -> { + Object javaObject = env.getObject(); + if (javaObject instanceof SimpleMessage) { + return env.getSchema().getObjectType("SimpleMessage"); + } else if (javaObject instanceof UserProfile) { + return env.getSchema().getObjectType("UserProfile"); + } + return null; + }) + ) + .build(); + + GraphQLSchema schema = schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring); + return GraphQL.newGraphQL(schema).build(); + } +} diff --git a/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/MutationResolver.java b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/MutationResolver.java new file mode 100644 index 000000000000..f162c3481251 --- /dev/null +++ b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/MutationResolver.java @@ -0,0 +1,20 @@ +package com.baeldung.graphqlanydata; + +import graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; + +public class MutationResolver { + + public DataFetcher updateProfile() { + return environment -> { + String name = environment.getArgument("name"); + String type = environment.getArgument("type"); + + if ("message".equalsIgnoreCase(type)) { + return new SimpleMessage("Profile updated for " + name); + } else { + return new UserProfile("u123", name, "ACTIVE"); + } + }; + } +} diff --git a/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/SimpleMessage.java b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/SimpleMessage.java new file mode 100644 index 000000000000..46bbfb3112a7 --- /dev/null +++ b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/SimpleMessage.java @@ -0,0 +1,17 @@ +package com.baeldung.graphqlanydata; + +public class SimpleMessage implements AnydataResponse { + private String message; + + public SimpleMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/UserProfile.java b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/UserProfile.java new file mode 100644 index 000000000000..6fa24b5ee570 --- /dev/null +++ b/graphql-modules/graphql-java/src/main/java/com/baeldung/graphqlanydata/UserProfile.java @@ -0,0 +1,38 @@ +package com.baeldung.graphqlanydata; + +public class UserProfile implements AnydataResponse { + + private String id; + private String name; + private String status; + + public UserProfile(String id, String name, String status) { + this.id = id; + this.name = name; + this.status = status; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/graphql-modules/graphql-java/src/main/resources/schema.graphqls b/graphql-modules/graphql-java/src/main/resources/schema.graphqls index da10cd18bdef..53b6d8c894b9 100644 --- a/graphql-modules/graphql-java/src/main/resources/schema.graphqls +++ b/graphql-modules/graphql-java/src/main/resources/schema.graphqls @@ -37,6 +37,21 @@ type Attribute { } scalar JSON +type SimpleMessage { + message: String! +} + +type UserProfile { + id: ID! + name: String! + status: String! +} + +union AnyDataResponse = SimpleMessage | UserProfile + +type Mutation { + updateProfile(name: String!, type: String!): AnyDataResponse +} schema { query: Query