Graphql использует тип ввода для поиска данных - PullRequest
0 голосов
/ 18 января 2019

У меня проблема с поиском с использованием Input data в 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<String> fetcher9 = dataFetchingEnvironment ->
            getByInput((dataFetchingEnvironment.getArgument("example")));

        return RuntimeWiring.newRuntimeWiring()
                .type("Query", typeWriting ->
                   typeWriting
                    .dataFetcher("getByInput", fetcher9)
                    )
                .build();
    }


public String getByInput(Character character) {
    return "testCharacter";
}
  }

items.graphqls содержимое файла:

type Query {
   getByInput(example: Character): String
}

input Character {
    name: String
}

При запросе такого ресурса:

query {
    getByInput (example: {name: "aa"} )
}

Персонаж DTO:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Character {
    protected String name;
}

У меня ошибка:

"Exception while fetching data (/getByInput) : java.util.LinkedHashMap cannot be cast to pl.graphql.Character",

Как должен выглядеть запрос?

Редактировать

Если я изменю на:

public String getByInput(Object character) 

Коды работают нормально - но я хочу конвертировать в работу.

1 Ответ

0 голосов
/ 19 января 2019

Для входного аргумента, тип которого является типом input, graphql-java преобразует его в Map.

В вашем случае запрос - getByInput (example: {name: "aa"} ), аргумент example имеет тип input. Итак,

dataFetchingEnvironment.get("example");

вернет карту со структурой (key = "name", value = "aa"). При попытке привести карту к Character, что определенно дает вам ошибку, поскольку они совершенно разных типов.

Чтобы преобразовать карту в Character, graphql-java не поможет вам в таком преобразовании. Вы должны самостоятельно реализовать коды преобразования или использовать другие библиотеки, такие как Jackson, Gson, Dozer или любые другие библиотеки, которые вам нравятся , для преобразования карты в объект вашего домена (т. Е. Символ).

...