Spring Boot GraphQL架构检测出现未映射字段问题求助
运行集成GraphQL API的Spring Boot应用时,启动阶段的GraphQL架构检测输出了未映射字段的INFO日志:
2024-01-18T20:48:48.900Z INFO 66 --- [ restartedMain] o.s.b.a.g.GraphQlAutoConfiguration : GraphQL schema inspection: surgio-api | Unmapped fields: {Query=[assets, assetTypes], Asset=[isTemplate], User=[isTwoFactorAuthEnabled, isAccountLocked, isPasswordExpired, isVerified], KeyPair=[isActive], AccountProperty=[isCustomerFacing]} surgio-api | Unmapped registrations: {} surgio-api | Skipped types: []
这些未映射字段均为实体类中的布尔类型字段,所有字段都遵循了相同的命名规范,以Asset.java为例:
@Entity public class Asset extends SoftDeleteEntity { private boolean isTemplate; public boolean isTemplate() { return this.isTemplate; } public void setTemplate(boolean isTemplate) { this.isTemplate = isTemplate; } }
对应的GraphQL Schema定义:
type Asset { id: Int isTemplate: Boolean }
实际运行时字段映射完全正常,接口响应也能返回正确的布尔值,请问该如何处理这类未映射字段的提示?
问题根源
Spring GraphQL的架构检查逻辑对JavaBean布尔类型的字段映射规则是:将isXXX()形式的getter方法解析为字段名xxx,但你的GraphQL Schema中字段名是isXXX,所以检查逻辑认为该字段未映射;而实际运行时,数据绑定组件能兼容这种命名差异,因此字段值能正常返回,出现了提示和实际行为不一致的情况。
具体解决方法
调整GraphQL Schema字段名(推荐)
保持Java实体类的JavaBean规范,将Schema中的字段名从isTemplate改为template,和getter方法解析后的字段名匹配:type Asset { id: Int template: Boolean }这种方式符合Java和GraphQL的命名惯例,避免后续潜在的兼容问题。
显式指定字段映射关系
在实体类的getter方法上添加@GraphQLField注解,明确指定对应GraphQL Schema中的字段名,让架构检查逻辑识别到映射关系:import org.springframework.graphql.data.method.annotation.GraphQLField; // ... @GraphQLField(name = "isTemplate") public boolean isTemplate() { return this.isTemplate; }关闭架构检查的INFO提示
如果确认所有字段都能正常工作,只是不想看到该提示,可以通过配置降低相关日志的级别。在application.yml中添加:logging: level: org.springframework.boot.autoconfigure.graphql.GraphQlAutoConfiguration: WARN这样就不会输出该类的INFO级别的架构检查日志了。
内容的提问来源于stack exchange,提问作者Andy Erickson

