graphql-spqr 无法查询父类字段

Posted

技术标签:

【中文标题】graphql-spqr 无法查询父类字段【英文标题】:graphql-spqr can not query the parent class field 【发布时间】:2020-02-28 06:33:26 【问题描述】:

我尝试使用多态性来实现实体类。

这是我的BaseEntity

@Getter
@Setter
@Accessors(chain = true)
@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity 

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Size(max = 55, message = "name length more then 55")
  private String name;

  @Size(max = 255, message = "remark length more than 255")
  private String remark;



还有我的实体

@Data
@NoArgsConstructor
@Table(name = "sys_user")
@Entity(name = "sys_user")
@Accessors(chain = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class SysUser extends BaseEntity implements Serializable 

  @NonNull
  private String username;

  @NonNull
  private String password;


在我的控制器中

@Controller
@GraphQLApi
@RequiredArgsConstructor
public class SysUserController implements BaseController 

  private final SysUserRepository sysUserRepository;

  @GraphQLQuery
  public List<SysUser> sysUsers() 
    return sysUserRepository.findAll();
  



我的 GraphQL 配置

@Configuration
@RequiredArgsConstructor
public class GraphQLConfig 

  private final @NotNull List<BaseController> controllerLists;

  @Bean
  public GraphQLSchema graphqlSchema() 
    GraphQLSchemaGenerator generator = new GraphQLSchemaGenerator();
    generator.withOperationsFromSingletons(controllerLists.toArray());
    return generator.generate();
  


现在,我试着得到


  sysUsers 
    username
  

结果是对的


  "data": 
    "sysUsers": [
      
        "username": "Hello"
      
    ]
  

但我尝试获取父类字段:


  sysUsers 
    name
  

我会得到一个错误


  "errors": [
    
      "message": "Validation error of type FieldUndefined: Field 'name' in type 'SysUser' is undefined @ 'sysUsers/name'",
      "locations": [
        
          "line": 3,
          "column": 5
        
      ]
    
  ]

我用io.leangen.graphql:graphql-spqr-spring-boot-starter:0.0.4

如何解决这个问题?

谢谢!

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

仅当它们位于配置的包中时,才会公开继承的字段。这样,您就不会意外暴露框架字段、JDK 字段(如hashCode)等。如果没有配置基本包,SPQR 将保留在直接暴露的类所在的包中。

要配置基本包,请添加如下内容:

graphql.spqr.base-packages=your.root.package,your.other.root.package

到您的application.properties 文件。

注意:这些rules will get relaxed in the next release of SPQR,让所有非JDK的字段都默认暴露,因为目前的行为似乎迷惑了太多人。

【讨论】:

【参考方案2】:

我建议您根据您的 graphql 架构中定义的类型添加自动生成类。 它将使您更清楚地了解向用户公开的内容,并避免将来出现此类错误。 以下是插件:

Gradle 插件:graphql-java-codegen-gradle-plugin Maven 插件:grapqhl-java-codegen-maven-plugin

【讨论】:

以上是关于graphql-spqr 无法查询父类字段的主要内容,如果未能解决你的问题,请参考以下文章

通过查询模式通过子对象访问父对象的受保护字段

SubSelectionRequired 类型的验证错误:字段时间戳类型需要子选择

有没有办法将 GraphQL 查询字段分组到子/嵌套查询组中?

父类的字段无法识别

带有 Spring Boot 和事务边界的 graphql-spqr

在 graphql-spqr 中以 Double 值对 NaN 建模