Graphql 没有为 interface/union 定义解析器 - java
Graphql no resolver definied for interface/union - java
我在 graphql
中使用此方法添加解析器时遇到问题:
@RestController
@RequestMapping("/api/dictionary/")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DictionaryController {
@Value("classpath:items.graphqls")
private Resource schemaResource;
private GraphQL graphQL;
private final DictionaryService dictionaryService;
@PostConstruct
public void loadSchema() throws IOException {
File schemaFile = schemaResource.getFile();
TypeDefinitionRegistry registry = new SchemaParser().parse(schemaFile);
RuntimeWiring wiring = buildWiring();
GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(registry, wiring);
graphQL = GraphQL.newGraphQL(schema).build();
}
private RuntimeWiring buildWiring() {
DataFetcher<List<DictionaryItemWithParentDto>> fetcher6 = dataFetchingEnvironment -> dictionaryService.getClaimSubType();
return RuntimeWiring.newRuntimeWiring()
.type("Query", typeWriting ->
typeWriting
.dataFetcher("getClaimSubType", fetcher6)
)
.build();
}
public List<DictionaryItemWithParentDto> getClaimSubType() {
return dictionaryService.getClaimSubType();
}
}
items.graphqls
文件内容:
type Query {
getClaimSubType: [DictionaryItemWithParentDto]
}
type DictionaryItemWithParentDto {
code: String!
name: String
parents: [DictionaryItemDto]
}
type DictionaryItemDto {
code: String!
name: String
description: String
}
在 java 中,我有 Vehicle
接口和两个实现它的 类:Airplane
和 Car
。当我将这一行添加到模式时:
union SearchResult = Airplane | Car
我收到以下错误:
There is no type resolver defined for interface / union 'Vehicle' type, There is no type resolver defined for interface / union 'SearchResult' type]}
我不知道怎么处理。
如果我添加:
interface Vehicle {
maxSpeed: Int
}
type Airplane implements Vehicle {
maxSpeed: Int
wingspan: Int
}
type Car implements Vehicle {
maxSpeed: Int
licensePlate: String
}
我收到以下错误:
errors=[There is no type resolver defined for interface / union 'Vehicle' type]
我如何使用我的方法处理这些错误?有没有另一种方法来处理它?
编辑
我猜添加这些代码行可以部分解决问题:
TypeResolver t = new TypeResolver() {
@Override
public GraphQLObjectType getType(TypeResolutionEnvironment env) {
Object javaObject = env.getObject();
if (javaObject instanceof Car) {
return env.getSchema().getObjectType("Car");
} else if (javaObject instanceof Airplane) {
return env.getSchema().getObjectType("Airplane");
} else {
return env.getSchema().getObjectType("Car");
}
}
};
并添加到 RuntimeWiring
构建器中:
.type("Vehicle", typeWriting ->
typeWriting
.typeResolver(t)
)
@PostMapping("getVehicle")
public ResponseEntity<Object> getVehicleMaxSpeed(@RequestBody String query)
{
ExecutionResult result = graphQL.execute(query);
return new ResponseEntity<Object>(result, HttpStatus.OK);
}
请求时:
query {
getVehicle(maxSpeed: 30) {
maxSpeed
}
}
我得到 maxSpeed
但是当我添加 wingspan
时出现错误
Field 'wingspan' in type 'Vehicle' is undefined @ 'getVehicle/wingspan'",
我加了
getVehicle(maxSpeed: Int): Vehicle
到 graphqls
文件。我认为多态性在这里会起作用。
添加这些代码行可以解决问题:
TypeResolver t = new TypeResolver() {
@Override
public GraphQLObjectType getType(TypeResolutionEnvironment env) {
Object javaObject = env.getObject();
if (javaObject instanceof Car) {
return env.getSchema().getObjectType("Car");
} else if (javaObject instanceof Airplane) {
return env.getSchema().getObjectType("Airplane");
} else {
return env.getSchema().getObjectType("Car");
}
}
};
并添加到 RuntimeWiring
构建器中:
.type("Vehicle", typeWriting ->
typeWriting
.typeResolver(t)
)
@PostMapping("getVehicle")
public ResponseEntity<Object> getVehicleMaxSpeed(@RequestBody String query)
{
ExecutionResult result = graphQL.execute(query);
return new ResponseEntity<Object>(result, HttpStatus.OK);
}
请求时:
query {
getVehicle(maxSpeed: 30) {
maxSpeed
}
}
我得到 maxSpeed
但是当我添加 wingspan
我得到一个错误
Field 'wingspan' in type 'Vehicle' is undefined @ 'getVehicle/wingspan'",
我加了
getVehicle(maxSpeed: Int): Vehicle
到 graphqls
文件。我认为多态性在这里会起作用。
如果我想要子类中的字段,我可以这样要求它们:
query {
getVehicle(maxSpeed: 10) {
maxSpeed
... on Airplane {
wingspan
}
... on Car {
licensePlate
}
}
}
我在 graphql
中使用此方法添加解析器时遇到问题:
@RestController
@RequestMapping("/api/dictionary/")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DictionaryController {
@Value("classpath:items.graphqls")
private Resource schemaResource;
private GraphQL graphQL;
private final DictionaryService dictionaryService;
@PostConstruct
public void loadSchema() throws IOException {
File schemaFile = schemaResource.getFile();
TypeDefinitionRegistry registry = new SchemaParser().parse(schemaFile);
RuntimeWiring wiring = buildWiring();
GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(registry, wiring);
graphQL = GraphQL.newGraphQL(schema).build();
}
private RuntimeWiring buildWiring() {
DataFetcher<List<DictionaryItemWithParentDto>> fetcher6 = dataFetchingEnvironment -> dictionaryService.getClaimSubType();
return RuntimeWiring.newRuntimeWiring()
.type("Query", typeWriting ->
typeWriting
.dataFetcher("getClaimSubType", fetcher6)
)
.build();
}
public List<DictionaryItemWithParentDto> getClaimSubType() {
return dictionaryService.getClaimSubType();
}
}
items.graphqls
文件内容:
type Query {
getClaimSubType: [DictionaryItemWithParentDto]
}
type DictionaryItemWithParentDto {
code: String!
name: String
parents: [DictionaryItemDto]
}
type DictionaryItemDto {
code: String!
name: String
description: String
}
在 java 中,我有 Vehicle
接口和两个实现它的 类:Airplane
和 Car
。当我将这一行添加到模式时:
union SearchResult = Airplane | Car
我收到以下错误:
There is no type resolver defined for interface / union 'Vehicle' type, There is no type resolver defined for interface / union 'SearchResult' type]}
我不知道怎么处理。
如果我添加:
interface Vehicle {
maxSpeed: Int
}
type Airplane implements Vehicle {
maxSpeed: Int
wingspan: Int
}
type Car implements Vehicle {
maxSpeed: Int
licensePlate: String
}
我收到以下错误:
errors=[There is no type resolver defined for interface / union 'Vehicle' type]
我如何使用我的方法处理这些错误?有没有另一种方法来处理它?
编辑
我猜添加这些代码行可以部分解决问题:
TypeResolver t = new TypeResolver() {
@Override
public GraphQLObjectType getType(TypeResolutionEnvironment env) {
Object javaObject = env.getObject();
if (javaObject instanceof Car) {
return env.getSchema().getObjectType("Car");
} else if (javaObject instanceof Airplane) {
return env.getSchema().getObjectType("Airplane");
} else {
return env.getSchema().getObjectType("Car");
}
}
};
并添加到 RuntimeWiring
构建器中:
.type("Vehicle", typeWriting ->
typeWriting
.typeResolver(t)
)
@PostMapping("getVehicle")
public ResponseEntity<Object> getVehicleMaxSpeed(@RequestBody String query)
{
ExecutionResult result = graphQL.execute(query);
return new ResponseEntity<Object>(result, HttpStatus.OK);
}
请求时:
query {
getVehicle(maxSpeed: 30) {
maxSpeed
}
}
我得到 maxSpeed
但是当我添加 wingspan
时出现错误
Field 'wingspan' in type 'Vehicle' is undefined @ 'getVehicle/wingspan'",
我加了
getVehicle(maxSpeed: Int): Vehicle
到 graphqls
文件。我认为多态性在这里会起作用。
添加这些代码行可以解决问题:
TypeResolver t = new TypeResolver() {
@Override
public GraphQLObjectType getType(TypeResolutionEnvironment env) {
Object javaObject = env.getObject();
if (javaObject instanceof Car) {
return env.getSchema().getObjectType("Car");
} else if (javaObject instanceof Airplane) {
return env.getSchema().getObjectType("Airplane");
} else {
return env.getSchema().getObjectType("Car");
}
}
};
并添加到 RuntimeWiring
构建器中:
.type("Vehicle", typeWriting ->
typeWriting
.typeResolver(t)
)
@PostMapping("getVehicle")
public ResponseEntity<Object> getVehicleMaxSpeed(@RequestBody String query)
{
ExecutionResult result = graphQL.execute(query);
return new ResponseEntity<Object>(result, HttpStatus.OK);
}
请求时:
query {
getVehicle(maxSpeed: 30) {
maxSpeed
}
}
我得到 maxSpeed
但是当我添加 wingspan
我得到一个错误
Field 'wingspan' in type 'Vehicle' is undefined @ 'getVehicle/wingspan'",
我加了
getVehicle(maxSpeed: Int): Vehicle
到 graphqls
文件。我认为多态性在这里会起作用。
如果我想要子类中的字段,我可以这样要求它们:
query {
getVehicle(maxSpeed: 10) {
maxSpeed
... on Airplane {
wingspan
}
... on Car {
licensePlate
}
}
}