Я пытаюсь создать схему GraphQL во время выполнения без каких -либо статических определений схемы. У меня есть следующие классы < /p>
@Component
public class GraphQLProvider {
private GraphQL graphQL;
private final ConnectionManager connectionManager;
public GraphQLProvider(ConnectionManager connectionManager) {this.connectionManager = connectionManager;}
@PostConstruct
public void init() {
GraphQLSchema schema = generateSchemaFromDB();
System.out.println( new SchemaPrinter().print( schema ) );
this.graphQL = GraphQL.newGraphQL( schema ).build();
}
public GraphQL getGraphQL() {
return graphQL;
}
private GraphQLSchema generateSchemaFromDB() {
// Map tableTypeMap = new HashMap();
List queryFieldDefinitions = new ArrayList();
try ( Connection connection = connectionManager.getConnection() ) {
DatabaseMetaData metaData = connection.getMetaData();
try ( ResultSet tables = metaData.getTables( null, null, null, new String[] { "TABLE" } ) ) {
while ( tables.next() ) {
String tableName = tables.getString( "TABLE_NAME" );
if ( !"trade".equalsIgnoreCase( tableName ) )
continue;
GraphQLObjectType.Builder typeBuilder = GraphQLObjectType.newObject().name( tableName );
try ( ResultSet columns = metaData.getColumns( null, null, tableName, "%" ) ) {
while ( columns.next() ) {
String columnName = columns.getString( "COLUMN_NAME" );
int dataType = columns.getInt( "DATA_TYPE" );
GraphQLOutputType graphQLType = mapSqlTypeToGraphQL( dataType );
typeBuilder.field(
GraphQLFieldDefinition.newFieldDefinition()
.name( columnName )
.type( graphQLType )
.build()
);
}
}
GraphQLObjectType tableType = typeBuilder.build();
GraphQLFieldDefinition tableQueryField = GraphQLFieldDefinition.newFieldDefinition()
.name( tableName.toLowerCase() )
.type( GraphQLList.list( tableType ) )
.dataFetcher( environment -> fetchRowsForTable( tableName ) )
.build();
queryFieldDefinitions.add( tableQueryField );
}
}
} catch ( SQLException e ) {
throw new RuntimeException( "Error generating GraphQL schema", e );
}
GraphQLObjectType queryType = GraphQLObjectType.newObject()
.name( "Query" )
.fields( queryFieldDefinitions )
.build();
return GraphQLSchema.newSchema()
.query( queryType )
.build();
}
private GraphQLOutputType mapSqlTypeToGraphQL(int sqlType) {
switch ( sqlType ) {
case Types.VARCHAR:
case Types.CHAR:
case Types.LONGVARCHAR:
return Scalars.GraphQLString;
case Types.INTEGER:
case Types.SMALLINT:
case Types.TINYINT:
return Scalars.GraphQLInt;
case Types.BIGINT:
return Scalars.GraphQLString;
case Types.FLOAT:
case Types.REAL:
case Types.DOUBLE:
return Scalars.GraphQLFloat;
case Types.BOOLEAN:
case Types.BIT:
return Scalars.GraphQLBoolean;
default:
return Scalars.GraphQLString;
}
}
private List fetchRowsForTable(String tableName) {
List rows = new ArrayList();
String sql = "SELECT * FROM " + tableName;
try ( Connection connection = connectionManager.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( sql ) ) {
ResultSetMetaData rsMeta = rs.getMetaData();
int columnCount = rsMeta.getColumnCount();
while ( rs.next() ) {
Map row = new HashMap();
for ( int i = 1; i
@Configuration
public class GraphQLConfig {
@Bean
@Primary
public GraphQlSource graphQlSource(GraphQLProvider graphQLProvider) {
GraphQLSchema schema = graphQLProvider.getGraphQL().getGraphQLSchema();
return GraphQlSource.builder( schema ).build();
}
}
< /code>
The schema printed by schemaprinter is expected and its correct.
I experience 404 when I try to query with this setup in postman but if i run with predefined graphql schemas without the dynamic generation i get the result as expected.
Подробнее здесь: https://stackoverflow.com/questions/794 ... generation
404 во время самоанализа в GraphQL с динамическим генерацией кода ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как повторить попытку самоанализа токена для непрозрачного токена сервера ресурсов OAuth 2.0
Anonymous » » в форуме JAVA - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как повторить попытку самоанализа токена для непрозрачного токена сервера ресурсов OAuth 2.0
Anonymous » » в форуме JAVA - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-