Cucumber DocStringType绑定Jackson时字段存在仍报UnrecognizedPropertyException
Cucumber DocString 反序列化 Jackson 字段未识别异常修复
问题根因
异常提示0 known properties说明问题并非JSON字段和POJO字段名不匹配——Jackson根本没有识别到DataSetMetaData类里的任何可绑定属性,是两个配置问题叠加导致的:
- Cucumber内置转换器优先级覆盖自定义实现:Cucumber 7.x 版本对带媒体类型标记的DocString提供了默认转换逻辑,你在Feature文件中写的
"""json明确标记了DocString类型为json,Cucumber会优先调用内置的JSON转换器,用自带的默认ObjectMapper实例做反序列化,不会执行你写的@DocStringType标注的自定义转换方法。 - Lombok 构造器生成逻辑和Jackson未适配:Cucumber内置的默认ObjectMapper没有做Lombok相关适配,你的POJO类加了
@Builder注解后,Lombok自动生成的类构造器、访问器结构无法被Jackson默认扫描逻辑识别,因此找不到任何可绑定的属性,最终抛出字段不识别的异常。
解决方案
两种方案可任选其一:
方案1:保留自定义转换逻辑(灵活度更高,推荐)
- 两种修改方式二选一,让Cucumber匹配到你的自定义转换器:
- 方式A:去掉Feature文件中DocString的
json媒体类型标记:Scenario Outline: CucumberTest Given Generate Data Set """ { "tcIdentifier":"TC1" } """ Examples: |TESTCASEIDENTIFIER| |TC1 | - 方式B:保留
json标记,给自定义转换器的@DocStringType注解显式指定匹配的媒体类型,自定义转换器优先级高于内置实现:@DocStringType(contentType = "json") public DataSetMetaData createTestDataForSorting(String details) throws JsonProcessingException { return new ObjectMapper().readValue(details, DataSetMetaData.class); }
- 方式A:去掉Feature文件中DocString的
- 修复POJO和Jackson的适配问题,两种方式二选一:
- 方式A:如果使用Lombok 1.18.14及以上版本,给类添加
@Jacksonized注解,自动适配Jackson序列化/反序列化逻辑:@Getter @Setter @ToString @AllArgsConstructor @Builder @Jacksonized // 新增该注解 @NoArgsConstructor public class DataSetMetaData { private String tcIdentifier; } - 方式B:如果Lombok版本较低不支持
@Jacksonized,直接去掉类上的@Builder注解即可。你已经添加了@NoArgsConstructor和@Setter注解,Jackson会默认通过无参构造实例化对象,再通过setter方法注入属性,不需要额外适配。
- 方式A:如果使用Lombok 1.18.14及以上版本,给类添加
方案2:使用Cucumber内置JSON转换器,删除自定义逻辑
- 直接删除你写的
createTestDataForSorting自定义转换方法,不需要手动实现DocString解析。 - 按照方案1中的POJO适配方式,给
DataSetMetaData类添加@Jacksonized注解(或移除@Builder注解)。 - 保留Feature文件中DocString的
json类型标记,Cucumber会自动完成JSON到POJO的反序列化。
关于@JsonProperty注解的说明
直接给字段添加@JsonProperty("tcIdentifier")之所以能临时解决问题,是因为Jackson会直接识别被该注解标记的字段,不需要依赖扫描setter、构造器参数的逻辑,属于绕过根因的临时方案,没有解决转换器匹配和Lombok适配的本质问题,后续新增字段时容易重复出现同类异常。
内容的提问来源于stack exchange,提问作者Palaniyappan
相关产品推荐
相关产品推荐

