Mongodb 如何避免在morphia中将空HashMap转换为null?
我们正在使用org.mongodb.morphia在持久化之前转换对象BasicDBObject。遇到的一个问题是,在某些情况下,要转换的对象包含大小为0的空HashMap,转换后,HashMap将转换为null。所以NullPointerException会在以后的访问中抛出。我想请专家帮忙,有什么办法可以避免吗?我的意思是,在转换之后,它仍然是一个大小为0的哈希映射 要转换的类的一部分:Mongodb 如何避免在morphia中将空HashMap转换为null?,mongodb,morphia,Mongodb,Morphia,我们正在使用org.mongodb.morphia在持久化之前转换对象BasicDBObject。遇到的一个问题是,在某些情况下,要转换的对象包含大小为0的空HashMap,转换后,HashMap将转换为null。所以NullPointerException会在以后的访问中抛出。我想请专家帮忙,有什么办法可以避免吗?我的意思是,在转换之后,它仍然是一个大小为0的哈希映射 要转换的类的一部分: public class ProjectServiceAdapterConfig { @NotN
public class ProjectServiceAdapterConfig {
@NotNull
private String serviceAdapterId;
@NotNull
private String projectId;
@Embedded
@Flatten
private Map<String, Map<String, String>> connections = new HashMap<>();
//...... setter and getter skipped here
}
转换后的一个:
[2] = {java.util.LinkedHashMap$Entry@8910}"connections" -> size = 1
key: java.lang.String = {java.lang.String@8911}"connections"
value: com.mongodb.BasicDBObject = {com.mongodb.BasicDBObject@8912} size = 1
[0] = {java.util.LinkedHashMap$Entry@8923}"accounts" -> null
key: java.lang.String = {java.lang.String@8895}"accounts"
value: = null
正如您所看到的,它被转换为null,这是我们试图避免的。
谢谢在调用morphia.mapPackage()之前,请执行以下操作:
morphia.getMapper().getOptions().storeEmpties = true;
这可能会为您映射回一个空映射。如果不自定义MapOfValuesConverter,我想我无法避免它。从源代码中可以看到,空映射将始终转换为null:
@Override
public Object encode(Object value, MappedField mf) {
if (value == null)
return null
Map<Object, Object> map = (Map<Object, Object>) value;
if ((map != null) && (map.size() > 0)) {
Map mapForDb = new HashMap();
for (Map.Entry<Object, Object> entry : map.entrySet()) {
String strKey = converters.encode(entry.getKey()).toString();
mapForDb.put(strKey, converters.encode(entry.getValue()));
}
return mapForDb;
}
return null;
}
@覆盖
公共对象编码(对象值,MappedField mf){
如果(值==null)
返回空
Map=(Map)值;
如果((map!=null)&&(map.size()>0)){
Map mapForDb=新的HashMap();
对于(Map.Entry:Map.entrySet()){
字符串strKey=converters.encode(entry.getKey()).toString();
put(strKey,converters.encode(entry.getValue());
}
返回mapForDb;
}
返回null;
}
如果morphia.getMapper().getOptions().setstoreexports(true)代码>不适用于您另一种解决方案是使用检查是否有空集合,并在必要时创建空集合
import java.util.*;
import org.mongodb.morphia.annotations.*;
import org.bson.types.ObjectId;
@Entity
public class Model {
@Id
private ObjectId id;
private Map<String, String> map;
protected Model() {}
public Model(HashMap<String, String> map) {
super();
setMap(map);
}
public void setMap(HashMap<String, String> map) {
this.map = map;
checkForNullMap();
}
@PostLoad
private void checkForNullMap() {
if (map == null) {
map = new HashMap<String, String>();
}
}
}
import java.util.*;
导入org.mongodb.morphia.annotations.*;
导入org.bson.types.ObjectId;
@实体
公共类模型{
@身份证
私有ObjectId;
私人地图;
受保护的模型(){}
公共模型(HashMap){
超级();
setMap(map);
}
公共void setMap(HashMap映射){
this.map=map;
checkForNullMap();
}
@后装
私有void checkForNullMap(){
if(map==null){
map=新的HashMap();
}
}
}
谢谢您的回复。我确实试过这个。不幸的是,它对我不起作用。您在调用morphia.mapPackage()之前做过这件事吗?我调用了getOptions().store清空=true,但从未调用过morphia.mapPackage()。我是这样使用它的:final MappedClass mc=mapper.getMappedClass(obj.getClass());final Map=mapper.toDBObject(obj.toMap();这就是问题所在吗?设置该值后,必须调用mapPackage()。理想情况下,您应该在第一次创建morphia实例时这样做。我认为它无法工作。唯一的方法是自定义MapOfValuesConverter,因为它总是将空映射转换为null
@Override
public Object encode(Object value, MappedField mf) {
if (value == null)
return null
Map<Object, Object> map = (Map<Object, Object>) value;
if ((map != null) && (map.size() > 0)) {
Map mapForDb = new HashMap();
for (Map.Entry<Object, Object> entry : map.entrySet()) {
String strKey = converters.encode(entry.getKey()).toString();
mapForDb.put(strKey, converters.encode(entry.getValue()));
}
return mapForDb;
}
return null;
}
import java.util.*;
import org.mongodb.morphia.annotations.*;
import org.bson.types.ObjectId;
@Entity
public class Model {
@Id
private ObjectId id;
private Map<String, String> map;
protected Model() {}
public Model(HashMap<String, String> map) {
super();
setMap(map);
}
public void setMap(HashMap<String, String> map) {
this.map = map;
checkForNullMap();
}
@PostLoad
private void checkForNullMap() {
if (map == null) {
map = new HashMap<String, String>();
}
}
}