Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何避免在morphia中将空HashMap转换为null?_Mongodb_Morphia - Fatal编程技术网

Mongodb 如何避免在morphia中将空HashMap转换为null?

Mongodb 如何避免在morphia中将空HashMap转换为null?,mongodb,morphia,Mongodb,Morphia,我们正在使用org.mongodb.morphia在持久化之前转换对象BasicDBObject。遇到的一个问题是,在某些情况下,要转换的对象包含大小为0的空HashMap,转换后,HashMap将转换为null。所以NullPointerException会在以后的访问中抛出。我想请专家帮忙,有什么办法可以避免吗?我的意思是,在转换之后,它仍然是一个大小为0的哈希映射 要转换的类的一部分: public class ProjectServiceAdapterConfig { @NotN

我们正在使用org.mongodb.morphia在持久化之前转换对象BasicDBObject。遇到的一个问题是,在某些情况下,要转换的对象包含大小为0的空HashMap,转换后,HashMap将转换为null。所以NullPointerException会在以后的访问中抛出。我想请专家帮忙,有什么办法可以避免吗?我的意思是,在转换之后,它仍然是一个大小为0的哈希映射

要转换的类的一部分:

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>();
        }
    }
}