首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >graphql-spqr无法查询父类字段

graphql-spqr无法查询父类字段
EN

Stack Overflow用户
提问于 2019-11-02 11:48:33
回答 2查看 473关注 0票数 1

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

这是我的BaseEntity

代码语言:javascript
复制
@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;

}

和我的实体

代码语言:javascript
复制
@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;

}

在我的控制器中

代码语言:javascript
复制
@Controller
@GraphQLApi
@RequiredArgsConstructor
public class SysUserController implements BaseController {

  private final SysUserRepository sysUserRepository;

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

}

我的GraphQL配置

代码语言:javascript
复制
@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();
  }

}

现在,我试着

代码语言:javascript
复制
{
  sysUsers {
    username
  }
}

结果是正确的

代码语言:javascript
复制
{
  "data": {
    "sysUsers": [
      {
        "username": "Hello"
      }
    ]
  }
}

但我尝试获取父类字段:

代码语言:javascript
复制
{
  sysUsers {
    name
  }
}

我将得到一个错误

代码语言:javascript
复制
{
  "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

如何解决这个问题?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-12-10 00:23:32

继承的字段只有在配置的包中才会被公开。这样,您就不会意外地公开框架字段、JDK字段(如hashCode)等。

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

代码语言:javascript
复制
graphql.spqr.base-packages=your.root.package,your.other.root.package

添加到application.properties文件中。

注意:这些rules will get relaxed in the next release of SPQR,以便所有非JDK字段在默认情况下都是公开的,因为当前的行为似乎让太多人感到困惑。

票数 0
EN

Stack Overflow用户

发布于 2019-12-27 05:18:17

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

graphql-java-codegen-gradle-plugin

  • Gradle plugin
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58668078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档