Java+GraphQL场景下如何生成短横线命名键的预期JSON响应
看起来你现在的问题是Java模型和GraphQL定义用的是驼峰命名,但调用外部API时需要输出短横线分隔(kebab-case)的JSON键名对吧?别担心,咱们可以通过调整JSON序列化规则来搞定这个问题,下面分步骤给你说:
1. 给Java模型添加JSON序列化注解
最直接的方式是在你的SampleRequest类的字段上,用Jackson的@JsonProperty注解指定对应的JSON键名。这样既不影响GraphQL层的驼峰参数接收,又能在序列化时输出短横线格式的键。
修改后的模型代码如下:
@Data @Getter @Setter public class SampleRequest{ @JsonProperty("sample-event") private String sampleEvent; @JsonProperty("sample-id") private String sampleId; }
解释一下:@JsonProperty注解会告诉Jackson,当把这个对象序列化成JSON时,把sampleEvent字段映射为sample-event,sampleId映射为sample-id,完美匹配你要的预期JSON格式。
2. 确保RestTemplate使用正确的ObjectMapper
如果你的项目里自定义了RestTemplate的ObjectMapper,要确保它没有覆盖掉注解的配置。不过一般来说,Spring默认的ObjectMapper会自动识别@JsonProperty注解,所以只要你加了上面的注解,RestTemplate在发送请求时,就会生成符合要求的JSON payload了。
3. 全局配置(可选)
如果你有很多类都需要转成kebab-case格式,也可以全局配置Jackson的命名策略,这样就不用每个字段都加注解了。比如在Spring Boot项目里,你可以在application.properties里加:
spring.jackson.property-naming-strategy=KEBAB_CASE
或者在配置类里自定义ObjectMapper:
@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE); return mapper; }
注意:全局配置会影响所有Java对象的JSON序列化,如果你只有个别类需要这种格式,还是用注解的方式更灵活。
这样调整之后,你的SendPayload方法发送的JSON就会变成预期的sample-event和sample-id键名啦。
备注:内容来源于stack exchange,提问作者Divya Muruganantham

