获取spring-data-mongodb以获得getter / setter而无需后备字段?

时间:2017-06-28 20:04:16

标签: spring-data-mongodb

我有一个通用的POJO:

public class Thing {
    private String name;
    private String etc;

    public String getName() {
        return name;
    }
    // other getters and setters
}

我使用Spring 4.3.9和Spring-data-mongodb 1.10.4。我想在Mongodb中存储这个POJO的实例,但我有一些约束:

  1. 我无法将Spring注释添加到基类(但我可以继承Thing并注释它。)
  2. 我想将name字段用作Mongodb唯一ID(主要是为了避免为其创建单独的唯一索引)。
  3. 我想(冗余地)将name字段存储为名为" name"的实际字段,以便该集合的其他消费者不必知道&#34 ;名称"存储在_id
  4. 我开始尝试这个:

    public class SpringThing extends Thing {
        @Id
        @Override
        public String getName() {
            return super.getName();
        }
        @Override
        public void setName(String name) {
            super.setName(name);
        }
    }
    

    这会导致spring为name使用_id的值,但当然它并不存储名为" name"的字段。在Mongodb。 The documentation说春天将使用"属性或字段"命名" id"或注明@Id。所以我尝试定义一个访问名称字段的冗余getter / setter:

    public class SpringThing extends Thing {
        @Id
        public String getId() {
            return super.getName();
        }
        public void setId(String id) {
            super.setName(id);
        }
    }
    

    不幸的是,spring在这里忽略getIdsetId,并使用自动生成的ID存储对象。我还尝试创建用@Field("name")注释的冗余getter / setter,但是spring似乎忽略了没有实际字段的任何getter / setter对。

    添加实际ID字段并存储名称副本确实有效:

    public class SpringThing extends Thing {
        @Id
        private String id;
    
        @Override
        public void setName(String id) {
            this.id = id;
            super.setName(id);
        }
    }
    

    但它需要定义一个名为" id"。

    的无意义字段

    有没有更合理的方法来获得我想要的东西?我开始尝试合理的是什么?

1 个答案:

答案 0 :(得分:1)

感谢@ mp911de的提示,我最终创建了一个Thing的子类,如下所示:

@TypeAlias("thing")
@Document(collection = "things")
public class SpringThing extends Thing {

    @Id
    @AccessType(Type.PROPERTY)
    @JsonIgnore
    public String getId() {
        return super.getName();
    }

    public void setId(String taskName) {
        super.setName(taskName);
    }
}
  • @TypeAlias注释会覆盖spring将用于该类型的名称,以掩盖我为了添加注释而创建子类的事实。
  • @Id说这是_id
  • 的吸气剂
  • @AccessType表示通过getter和setter访问此字段,而不是直接访问该字段。这就是我所需要的;没有它,spring会查找名为id的私有成员变量。
  • @JsonIgnore是Jackson(我们正在使用的JSON库)注释,用于防止在将这些对象序列化为JSON时包含id字段。