Java ObjectMapper更改我的字段名称时出现问题
我试图创建一个方法,将一个对象传递到该方法并读取所有字段,以便将null字段和字符串字段的值设置为“” 这个问题现在出现在我的课堂上。我有这个模型:Java ObjectMapper更改我的字段名称时出现问题,java,jackson,objectmapper,Java,Jackson,Objectmapper,我试图创建一个方法,将一个对象传递到该方法并读取所有字段,以便将null字段和字符串字段的值设置为“” 这个问题现在出现在我的课堂上。我有这个模型: @Getter @Setter @NoArgsConstructor @ToString public class AccountModel { private String noTotCount; private int nTotal; private String account; } 我用这种方法: 私有对象映射
@Getter
@Setter
@NoArgsConstructor
@ToString
public class AccountModel {
private String noTotCount;
private int nTotal;
private String account;
}
我用这种方法:
私有对象映射器obMapper=新对象映射器()
私有对象stringNullToEmpty(对象对象){
Class clase=object.getClass();
Map objectMap=obMapper.convertValue(对象,新类型引用(){});
for(字段:clase.getDeclaredFields()){
字符串fieldName=field.getName();
if(field.getType().equals(String.class)&&objectMap.get(fieldName)==null){
put(field.getName(),“a”);
}
}
返回obMapper.convertValue(objectMap,clase);
}
当我创建obMapper.convertValue()
时,会出现错误,因为他正在将我的noTotCount
字段转换为noTotCount
,因此当您进入条件并尝试put()
,objectMap中没有包含键noTotCount
的字段,因为包含objectMap的键是noTotCount
为什么ObjectMapper会将我的
noTotCount
字段转换为noTotCount
?当您的camelcase属性的第一个“单词”只有一个字母时,您遇到了java bean命名约定、lombok和jackson生成的getter名称的问题。有关更多详细信息,请参阅
总之,jackson希望属性(getter和setter)与IDE(例如eclipse)生成的属性一样:getntcount
,但是我猜lombok会生成getntcount
(我还没有删除您的代码)。这使得jackson失败(通过重命名getter复制)
解决方法:自己创建getter并防止lombok生成它
@JsonProperty(“nTotCount”)公共字符串getntcount()
或公共字符串getntcount()
请添加完整的模型。属性的名称来自getter/setter,而不是字段的名称。在我看来,你好像在打错字。@M.Deinum这是我的整个模型,我用的是龙眼annotations@Babyburger对不起,我在复制和粘贴时出错了,这篇文章已经被编辑过了
private Object stringNullToEmpty(Object object) {
Class<?> clase = object.getClass();
Map<String, Object> objectMap = obMapper.convertValue(object, new TypeReference<Map<String, Object>>(){});
for (Field field : clase.getDeclaredFields()) {
String fieldName = field.getName();
if(field.getType().equals(String.class) && objectMap.get(fieldName) == null) {
objectMap.put(field.getName(), "a");
}
}
return obMapper.convertValue(objectMap, clase);
}