为什么 Json 要求为 Junit 测试提供无参构造函数?

问题描述 投票:0回答:1

我在使用 Jackson 反序列化 JSON 字符串时遇到问题。我收到错误:com.fasterxml.jackson.databind.JsonMappingException:找不到类型[简单类型,类RatingDMO]的合适构造函数:无法从 JSON 对象实例化(需要添加/启用类型信息?)

我将字段映射到 JSON 文件,并且它的参数可作为属性使用并且具有相同的类型。

注意:- 如果我提供无参数构造函数(仅用于检查它是否有效),则测试有效。

我无法在代码中提供/保留默认构造函数,因为模型中的最终字段很少。

mapper.readValue(new File("RatingRequest.json"),RatingDMO.class);

POJO 类:

public class RatingDMO implements Serializable {
    
    private static final long serialVersionUID = -433016040176969496L;
    private String company;
    private String state;
    private String lob;
    private String channel;
    private String username;
    private String password;
    private String policyNumber;
    private long policyKey;
    private String transactionType;
    private String evaluationType;
    private String clientID;
    private String policyTerm;
    private String effectiveDate;
    private String policyXML;
    private String webXML;
    private String firstName;
    private String lastName;
    private String businessName;
    private String city;
    private String zip;
    private String effectiveDtStart;
    private String effectiveDtEnd;
    private String searchType;
    private String uuid;
    private List<String> policyStatusCodes;
    private Map<String,String> eAdvisorCoverages;
    private Map<String,String> customCoverages;
    private Map<String,String> defaultCoverages;
    private String action;
    private String type;
    private String selectedCoverage;
    private boolean motorClubMember;
    private String selectedSubCoveres;
    private boolean customRated;
    private final PolicyDMO policyDMO;
    private final String allInsuredInd;
    private final String medicareMediaidInd;
    private final boolean driversGreaterthan65;
         
    public PolicyRatingRequestDMO(PolicyDMO policyDMO, String allInsuredInd, String medicareMediaidInd, boolean driversGreaterthan65){
        this.policyDMO = policyDMO;
        this.allInsuredInd = allInsuredInd;
        this.medicareMediaidInd = medicareMediaidInd;
        this.driversGreaterthan65 = driversGreaterthan65;
    }
... }
java json junit jackson
1个回答
12
投票

默认情况下,Jackson 的数据绑定将尝试使用无参构造函数构造一个对象,然后从 JSON 的相应位填充该对象的属性。您可以使用注释覆盖此行为

@JsonCreator
public PolicyRatingRequestDMO(@JsonProperty("policyInfo") PolicyDMO policyDMO,
         @JsonProperty("allInsuredInd") String allInsuredInd,
         @JsonProperty("medicareMediaidInd") String medicareMediaidInd,
         @JsonProperty("driversGreaterThan65") boolean driversGreaterthan65){
    this.policyDMO = policyDMO;
    this.allInsuredInd = allInsuredInd;
    this.medicareMediaidInd = medicareMediaidInd;
    this.driversGreaterthan65 = driversGreaterthan65;
}

JsonCreator
注释告诉Jackson要调用哪个构造函数,其参数用
JsonProperty
注释以指示JSON中的哪些属性对应于构造函数中的哪些参数。 JSON 中与构造函数参数不对应的其他属性将像平常一样通过 setter 或直接字段访问注入。

© www.soinside.com 2019 - 2024. All rights reserved.