我尝试使用多态实现实体类。
这是我的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.graph ql:graph ql-spqr-spring-boot-starter:0.0.4
如何解决这个问题?
谢谢!
继承的字段只有在配置的包中才会公开。这样,您就不会意外地公开框架字段、JDK字段(如hashCode
)等。如果没有配置基本包,SPQR将保留在直接公开的类所在的包中。
要配置基本包,请添加以下内容:
graphql.spqr.base-packages=your.root.package,your.other.root.package
到您的application.properties
文件。
注意:这些规则将在SPQR的下一个版本中得到放松,因此所有非JDK字段默认公开,因为当前的行为似乎让太多人感到困惑。
我建议您根据graph ql模式中定义的类型添加类的自动生成。它将使您更清楚地了解向用户公开的内容并避免将来出现此类错误。以下是插件: