在反序列化期间,YAML Mapper如何忽略yml文件中的某些字段?

时间:2018-01-01 09:54:00

标签: java unit-testing serialization yaml objectmapper

我的项目中有一个property.yml文件,如下所示:

css

我使用以下java代码从上面的yml文件进行反序列化:

propertyA : "valueA"
propertyB: "valueB"
propertyC: "valueC"

现在,我需要编写单元测试。我的代码验证了如果yml文件中缺少任何propertyA,propertyB和propertyC,代码应抛出异常。

有没有办法可以让mapper在反序列化期间忽略某些字段(假设property.yml中没有这些字段)并执行我的测试?

property.yml实际上包含了巨大的号码。属性(= n,比方说)。生成n个property.yml文件进行测试是不可行的,而在每个文件中都会丢失一个属性。

3 个答案:

答案 0 :(得分:0)

您可以在类级别使用@JsonIgnoreProperties(ignoreUnknown = true)。

答案 1 :(得分:0)

你应该配置反序列化器不要在未知属性上失败:

File configFile = new File(classLoader.getResource("property.yml".getFile());
ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory())
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
config = yamlMapper.readValue(configFile, MyPOJO.class);

答案 2 :(得分:-1)

我有一个类似的问题,解决方案是ObjectMapper的' setSerializationInclusion '属性可以用作:

public DataTable CallStoredProcedure(System.String procedureName, Dictionary<string, object> parameters)
        {
            var cmd = CreateStoredProcCallCommand(procedureName, true);
            for (int i = 0; i < parameters.Count; i++)
            {
                var param = parameters.ElementAt(i);
                if (param.Value.GetType() == typeof(DataTable))
                    AddTableValuedParameter(cmd, "@" + param.Key, 0, ParameterDirection.Input, param.Value);
                else
                    AddParameter(cmd, "@" + param.Key, 2147483647, ParameterDirection.Input, param.Value);
            }

            var toReturn = new DataTable();
            CreateAndSetupAdapter(cmd).Fill(toReturn);
            return toReturn;
        }
private DbCommand CreateStoredProcCallCommand(string storedProcedureToCall, bool openConnection)
        {
            var cmd = _factoryToUse.CreateCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = storedProcedureToCall;
            return SetupCommand(cmd, openConnection);
        }
private DbDataAdapter CreateAndSetupAdapter(DbCommand selectCommand)
{
    var adapter = _factoryToUse.CreateDataAdapter();
    adapter.SelectCommand = selectCommand;
    return adapter;
}

 private static void AddTableValuedParameter(DbCommand cmd, string parameterName, int length, ParameterDirection direction, object value)
        {
            SqlParameter param = new SqlParameter();
            param.ParameterName = parameterName;
            param.SqlDbType = SqlDbType.Structured;
            param.Size = length;
            param.Value = value;
            param.Direction = direction;
            cmd.Parameters.Add(param);
        }
private static void AddParameter(DbCommand cmd, string parameterName, int length, ParameterDirection direction, object value)
        {
            var dummyParam = new EntityParameter() { Value = value };
            var parameter = cmd.CreateParameter();
            parameter.ParameterName = parameterName;
            parameter.Direction = direction;
            parameter.Size = length;
            parameter.Value = value;
            parameter.DbType = dummyParam.DbType;
            cmd.Parameters.Add(parameter);
        }

这只会将非空值写入输出YAML文件。