GraphQL 자바 - 데이터 가져 오기

A, 데이터를 가져 오는 방법을 graphql

각 필드는 관련된 정의 graphql graphql.schema.DataFetcher 있습니다.

일부 필드는 데이터베이스 필드에 액세스, 데이터 가져 오기 사용자 지정 코드를 사용하고 데이터베이스에서 정보를 획득한다. 대부분의 필드 이름과 필드 만 사용 평범하고 오래된 자바 객체 (POJO) 모델을 메모리 개체에서 데이터를 검색하는 데이터를 검색하기 위해 돌아왔다.

다른 graphq에서 데이터 가져 오기가 해결 프로그램을 호출 할 때, 그들을 얻을 수 있습니다.

다음과 같이 정의 유형을 가정하자 :

    type Query {
        products(match : String) : [Product]   # a list of products
    }

    type Product {
        id : ID
        name : String
        description : String
        cost : Float
        tax : Float
        launchDate(dateFormat : String = "dd, MMM, yyyy') : String
    }

Query.products 필드도 각 필드에 대한 데이터 가져 오기, 제품 유형이 있습니다.

더 복잡한 데이터 가져 오기를 할 수있다 데이터 Query.products 가져 오기 필드는, 제품 개체는 데이터베이스 작업에서 읽는 것을 포함한다. 그것은 차례로, 필터 오브젝트의 제품을 초래할 수 있으며, 선택적 매개 변수 일치를 사용합니다.

다음 가능한 이의 예이다 :

        DataFetcher productsDataFetcher = new DataFetcher<List<ProductDTO>>() {
            @Override
            public List<ProductDTO> get(DataFetchingEnvironment environment) {
                DatabaseSecurityCtx ctx = environment.getContext();

                List<ProductDTO> products;
                String match = environment.getArgument("match");
                if (match != null) {
                    products = fetchProductsFromDatabaseWithMatching(ctx, match);
                } else {
                    products = fetchAllProductsFromDatabase(ctx);
                }
                return products;
            }
        };

각 DataFetcher는 필드의 유형, 부모의 유형, 루트 개체 쿼리 또는 쿼리 컨텍스트 개체로 매개 변수 필드에 사용할 수있는 필드가 얻어진다 포함 graphql.schema.DataFetchingEnvironment 개체 및 기타 정보를 전달됩니다.

응용 프로그램 별 보안 핸들로 컨텍스트 오브젝트 코드를 사용하는 방법에 대한 위의 데이터 정보가 데이터베이스에 액세스 할 수 있습니다. 이 낮은 호출 컨텍스트를 제공하는 일반적인 기술이다.

우리가 ProductDTO 개체 목록이되면, 우리는 일반적으로 각 필드에 특별한 사용 데이터를 얻을 필요가 없습니다. graphql - 자바는 필드 이름에 따라 POJO 모델을 따라하는 방법을 알고, 스마트 graphql.schema.PropertyDataFetcher와 함께 제공됩니다. 이 데이터를 얻을 수있는 공공 문자열 getName () POJO 방법을 찾으려고 때문에 위의 예에서, 이름 필드가있다.

graphql.schema.PropertyDataFetcher 기본 데이터가 자동으로 경우 취득자의 각 필드와 연결되어 있습니다.

그러나, 당신은 여전히 ​​DTO 방법 graphql.schema.DataFetchingEnvironment에 액세스 할 수 있습니다. 이 송신에 앞서 조정 값을 허용한다. 예를 들어, 우리는 launchDate 필드가 위, 그것은 선택적 매개 변수의 dateformat을 사용할합니다. 우리는 원하는 형식에 적용이 일자 ProductDTO 논리적 형식을 만들 수 있습니다.

    class ProductDTO {

        private ID id;
        private String name;
        private String description;
        private Double cost;
        private Double tax;
        private LocalDateTime launchDate;

        // ...

        public String getName() {
            return name;
        }

        // ...

        public String getLaunchDate(DataFetchingEnvironment environment) {
            String dateFormat = environment.getArgument("dateFormat");
            return yodaTimeFormatter(launchDate,dateFormat);
        }
    }

둘째, 사용자 정의 PropertyDataFetcher

전술 한 바와 같이, 현장에서 획득 한 graphql.schema.PropertyDataFetcher graphql - 자바의 기본 데이터, 그것은 개체의 필드 값을 얻을 수있는 표준 모드를 ​​사용합니다.

그것은 자바 POJO 방법과지도 방법을 지원하는 데 사용됩니다. 기본적으로는 지원 객체가지도 인 경우 graphql 필드 fieldX를 들어, 그것은 POJO 속성의 이름을 찾을 수 있습니다 또는 fieldX이 fieldX의 맵키라고 가정한다.

graphql 스키마 이름과 실행의 이름을 지정할 때, 객체 사이의 미묘한 차이가있을 수 있습니다. 예를 들어, Product.description 실제로 자바 getDesc로 표현 런타임 ()에서 개체를 지원 같아요.

SDL은 스키마를 지정한 경우,이 명령은 @fetch 매핑을 지시 할 수 있습니다.

    directive @fetch(from : String!) on FIELD_DEFINITION

    type Product {
        id : ID
        name : String
        description : String @fetch(from:"desc")
        cost : Float
        tax : Float
    }

이 데이터 graphql 필드 명명 된 설명을 획득하면서 graphql.schema.PropertyDataFetcher는 속성 이름 내림차순를 사용하여 말할 것이다.

코드가 수동으로 스키마를 구성한 경우, 당신은 단지 코드에서 직접 지정해야합니다.

        GraphQLFieldDefinition descriptionField = GraphQLFieldDefinition.newFieldDefinition()
                .name("description")
                .type(Scalars.GraphQLString)
                .build();

        GraphQLCodeRegistry codeRegistry = GraphQLCodeRegistry.newCodeRegistry()
                .dataFetcher(
                        coordinates("ObjectType", "description"),
                        PropertyDataFetcher.fetching("desc"))
                .build();

三, DataFetchingEnvironment

각 데이터 취득자는 그 내용과 인수 매개 변수가 제공됩니다에 대한 자세한 내용은 수있는 graphql.schema.DataFetchingEnvironment 객체를 전달됩니다. 여기 DataFetchingEnvironment의 더 흥미로운 부분 중 일부입니다.

  • getSource와 T는 () 소스 객체 정보 필드를 획득하기 위해 사용된다. 이는 상위 필드의 객체 추출 된 결과 값이다. 정상적인 상황에서, 이것은 객체 DTO 메모리이므로 필드 값에 대한 간단한 POJO 게터이다. 더 복잡한 경우에, 당신은 현재 필드의 특정 정보를 얻는 방법 볼을 확인할 수 있습니다. 트리 graphql 필드를 수행 할 때, 값이 반환 된 각 필드는 오브젝트의 낮은 서브 필드의 원인이 될 것이다.
  • T getRoot는 () :이 특별한 목적은 graphql 쿼리를 시드하는 데 사용됩니다. 상단 필드의 경우, 루트 및 소스는 동일합니다. 루트 객체는 메시지 동안 변경하지 않을 것이며, (사용하지 않음) 널 (null) 일 수 있습니다.
  • 지도 <문자열, 객체> getArguments () 파라미터의 값 필드에 구비 된 이들 매개 변수는 AST 리터럴 분석 값과 디폴트 파라미터로부터 송신 나타낸다. 인수는 반환 특정 필드 값의 파라미터를 제어하는데 사용될 수있다.
  • T는 getContext () : 개체 컨텍스트가 첫 번째 쿼리가 실행될 때 설정하고, 쿼리의 라이프 사이클에 걸쳐 일정하게 유지된다. 상황은 종종 각 데이터 가져 오기에 대한 필드 데이터를 얻을 수하려고 할 때 필요한 호출 컨텍스트의 일부를 제공하기 위해 사용되는 값이 될 수 있습니다. 예를 들어, 사용자 자격 증명 또는 연결 매개 변수 현재는 가져 오기 층 비즈니스 요구 데이터에 대한 데이터베이스 컨텍스트 객체에 포함 할 수 있습니다. graphql 시스템 디자이너로서, 컨텍스트를 사용하는 방법에 대한 중요한 디자인 결정 중 하나입니다. 일부의 경우, 설계자는 사용이 필요하지 않은 경우에 자동적으로 콘텍스트 데이터 추출 부에 주입 된 프레임 워크의 사용에 의존한다.
  • ExecutionStepInfo getExecutionStepInfo () : 필드 유형 정보는 쿼리의 모든 필드가 실행 구축 할 정보의 유형입니다.
  • DataFetchingFieldSelectionSet getSelectionSet () : 현재 서브 필드 실행되는 필드에 "선택"나타냅니다 세트를 선택합니다.
  • ExecutionId getExecutionId는 () : 각 쿼리는 고유 ID가 있습니다. 각 쿼리의 로그를 표시하는 데 사용할 수 있습니다.

3.1 ExecutionStepInfo

필드와 해당 유형을 포함하는 호출 트리를 만들고, 쿼리를 실행하는 동안 Graphql. graphql.execution.ExecutionStepInfo.getParentTypeInfo 당신이 나무를 통과하고, 현재 필드의 유형 또는 필드 시작 실행을 볼 수 있습니다.

graphql.execution.ExecutionStepInfo.getPath 방법은 경로 표현을 반환합니다. 이 쿼리 로그 또는 인쇄를 디버깅하는 데 유용합니다.

헬퍼 방법이 있습니다, 당신은 목록 널 (null)이 아닌 또는 내부 포장 유형의 기본 유형을 얻을 수 있습니다.

3.2 DataFetchingFieldSelectionSet

다음과 같이 쿼리를 가정

    query {
        products {
            # the fields below represent the selection set
            name
            description
            sellingLocations {
                state
            }
        }
    }

식별 기호 제품 필드는 필드의 선택 세트를 나타냅니다. 필요한 하위 선택이 유용 할 수 있습니다 이해 때문에 데이터 가져 오기 데이터 액세스 쿼리를 최적화 할 수 있습니다. 예를 들어, SQL 지원 시스템은 열을 검색하기 위해 요청 된 필드의 선택 세트를 사용할 수 있습니다.

위의 예에서, 우리는 sellingLocations 정보를 요구, 그래서 우리는 제품 정보와 판매 위치 정보 액세스 쿼리를 물어 때 우리는보다 효율적으로 데이터를 할 수 있습니다.

추천

출처www.cnblogs.com/pku-liuqiang/p/11502414.html