Исключение Springboot 2.2 и graphql RawClassRequiredForGraphQLMappingException: объект не может быть сопоставлен с типом GraphQL

#spring-boot #cassandra #graphql-java

#весенняя загрузка #cassandra #graphql-java

Вопрос:

Я работаю над тестовым проектом с использованием Cassandra, GraphQL и Spring Boot 2.2.0.M1. У меня есть следующие зависимости в моем pom.xml

  <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-cassandra</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-java-tools</artifactId>
        <version>4.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>4.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphiql-spring-boot-starter</artifactId>
        <version>4.0.0</version>
    </dependency>
 </dependencies>
  

Ниже приведена моя таблица в cassandra после выполнения DESC TABLE product

 CREATE TABLE jerseys237.product (
 prod_id timeuuid PRIMARY KEY,
 available float,
 description text,
 discount float,
 league text,
 picture text,
 price float,
 team_country text,
 team_crest text,
 team_name text,
 team_region text,
 title text
)... 
  

Мой product.grapqls файл:

 type Product { 
  prod_id: ID!
  available: Float
  description: String
  discount: Float
  league: String
  picture: String
  price: Float
  team_country: String
  team_crest: String
  team_name: String
  team_region: String
  title: String
}

type Query {  
 findAllProducts: [Product]  
 findProductByPrice(price: Float!): Product
 findProductByTitle(title: String!): Product
 countProducts: Long 
}  

type Mutation { 
 deleteProduct(prod_id: String!) : Boolean 
}

schema {
 query: Query
 mutation: Mutation   
}   
  

Также существует @Component public class Query implements GraphQLQueryResolver класс, у которого, похоже, нет никаких проблем. И, наконец, у меня есть Product Class :

   @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Table 
  public class Product {

@PrimaryKey
private String prod_id;
private Float available;
private String description;
private Float discount;
private String league; 
private String picture; //  or  private Byte[] picture; ??
private Float price;
private String team_country;
private String team_crest;  
private String team_name;
private String team_region;
private String title;

public Product(Float available, String description, Float discount, String league, String picture, Float price, String team_country, String team_crest, String team_name, String team_region, String title) {
    this.prod_id = UUIDs.timeBased().toString(); // automatically generate timeuuid
    this.available = available;
    this.description = description;
    this.discount = discount;
    this.league = league;
    this.picture = picture;
    this.price = price;
    this.team_country = team_country;
    this.team_crest = team_crest;
    this.team_name = team_name;
    this.team_region = team_region;
    this.title = title;
  }  
 }
  

Как вы можете видеть, некоторые столбцы в пространстве ключей Cassandra (например, team_crest ) должны иметь тип blob , но я не смог успешно сопоставить его с типом Java (но это другой вопрос). Итак, вот в чем проблема, после изменения версий spring boot и даже версий зависимостей, каждый раз, когда я запускаю приложение в моем netbeans, я получаю эту ошибку:

com.coxautodev.graphql.tools.TypeClassMatcher$RawClassRequiredForGraphQLMappingException: Type java.util.List<com.creatixxx.jersey.entities.Product> cannot be mapped to a GraphQL type! Since GraphQL-Java deals with erased types at runtime, only non-parameterized classes can represent a GraphQL type. This allows for reverse-lookup by java class in interfaces and union types

Как я могу устранить эту ошибку и заставить мое приложение работать?

Комментарии:

1. Вы, вероятно, следовали моему устаревшему руководству, поскольку у вас есть очень-очень старые версии всего. Я настоятельно рекомендую вам попробовать использовать graphql-java напрямую, следуя этому руководству. Вы также можете попробовать мой проект под названием GraphQL SPQR, если вас интересует подход «сначала код».

2. Спасибо за ответ. На самом деле я использовал последнюю версию всего, но все равно получил точно такую же ошибку, поэтому я понизил рейтинг в соответствии с этим другим руководством pluralsight.com/guides /…

3. Вот версия вашего руководства, которому я следовал: baeldung.com/spring-graphql

4. Точная ошибка, которую вы получаете, исходит от graphql-java-tools, который теперь находится под com.graphql-java-kickstart groupId и имеет версию 5.7.2. Сообщение об исключении является поддельным… у graphql-java нет проблем со списками или обобщениями. Вот почему я предлагаю использовать graphql-java напрямую. Официального руководства должно быть достаточно, чтобы вы начали.

5. Большое вам спасибо @kaqqao, я действительно ценю