如何在GraphQL SPQR中处理自增ID字段的Input非空约束问题
问题原因
Java基本类型int本身不支持null值,SPQR做Schema映射时会默认把所有基本类型字段统一标记为GraphQL非空类型,不管是输出类型还是输入类型,才会出现你遇到的输入类型强制要求传tradeId的问题。
解决方法
你可以根据自己的项目需求选任意一种方案:
方案1:修改字段为包装类型
把基本类型int改为支持null的包装类型Integer即可,ORM框架(Hibernate/MyBatis等)都能正常适配包装类型的主键字段,不会影响查询返回逻辑:@Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="trade_id") Integer tradeId;改完后SPQR生成的Input类型里tradeId会自动变成可选的
Int类型,不再是非空约束。方案2:用SPQR注解单独配置字段输入规则
如果不想修改原有字段类型,可以通过@GraphQLInputField注解强制指定输入时的可空性,输出逻辑不受任何影响:@Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="trade_id") @GraphQLInputField(nullable = true) int tradeId;如果想要完全避免新增时误传tradeId,还可以直接配置该字段不在输入类型中出现:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="trade_id") @GraphQLInputField(ignore = true) int tradeId;配置后TradeInput里不会包含tradeId字段,查询返回的Trade类型还是会正常返回tradeId的值,更贴合自增主键的使用场景。
方案3:全局配置适配所有自增主键
如果项目中有大量同样规则的自增主键字段,可以自定义SPQR的TypeMapper规则,统一识别所有标注了@GeneratedValue的主键字段,自动设置为输入可选/输入忽略,不需要逐个字段加注解。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

