You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:保留自定义转换逻辑(灵活度更高,推荐)

  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);
      }
      
  2. 修复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方法注入属性,不需要额外适配。

方案2:使用Cucumber内置JSON转换器,删除自定义逻辑

  1. 直接删除你写的createTestDataForSorting自定义转换方法,不需要手动实现DocString解析。
  2. 按照方案1中的POJO适配方式,给DataSetMetaData类添加@Jacksonized注解(或移除@Builder注解)。
  3. 保留Feature文件中DocString的json类型标记,Cucumber会自动完成JSON到POJO的反序列化。

关于@JsonProperty注解的说明

直接给字段添加@JsonProperty("tcIdentifier")之所以能临时解决问题,是因为Jackson会直接识别被该注解标记的字段,不需要依赖扫描setter、构造器参数的逻辑,属于绕过根因的临时方案,没有解决转换器匹配和Lombok适配的本质问题,后续新增字段时容易重复出现同类异常。

内容的提问来源于stack exchange,提问作者Palaniyappan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:09:41