I need to process the following request:
query {
_entities(representations: [
{__typename: "Large", id: "1"},
{__typename: "Middle", id: "2"}]) {
... on Middle {
small(id: "3") {
id
name
}
}
}
}
My small-service subgraph:
type Large @key(fields: "id") @extends {
id: UUID! @external
middle(id: UUID!): Middle
}
type Middle @key(fields: "id") @extends {
id: UUID! @external
small(id: UUID!): Small
}
type Small @key(fields: "id") {
id: UUID!
name: String!
}
SmallController:
@SchemaMapping(typeName = "Middle", field = "small")
public Response small(@Argument UUID id,
Large large,
Middle middle) {
return smallService.do(id, large, middle);
}
Source builder:
public GraphQlSourceBuilderCustomizer federationTransform() {
DataFetcher<?> entityDataFetcher = env -> {
List<Map<UUID, Object>> representations = env.getArgument(_Entity.argumentName);
return representations.stream()
.map(representation -> {
if (LARGE.equals(representation.get("__typename"))) {
return new Large(UUID.fromString((String) representation.get("id")));
}
if (MIDDLE.equals(representation.get("__typename"))) {
return new MIDDLE(UUID.fromString((String) representation.get("id")));
}
return null;
})
.collect(Collectors.toList());
};
TypeResolver entityTypeResolver = env -> {
final Object src = env.getObject();
if (src instanceof Large) {
return env.getSchema()
.getObjectType(LARGE);
}
if (src instanceof Middle) {
return env.getSchema()
.getObjectType(MIDDLE);
}
return null;
};
return builder -> builder.schemaFactory((registry, wiring) -> Federation.transform(registry, wiring)
.fetchEntities(entityDataFetcher)
.resolveEntityType(entityTypeResolver)
.build());
}
Error:
Parameter [1] in public Response SmallController.small(java.util.UUID,Large,Middle): does not match the source Object type 'class Middle'
Notes:
- With one parameter - all good.
- On GraphQlSourceBuilderCustomizer level in debug mode I see both representations.
Any advice or help would be greatly appreciated!