获取spring-data-mongodb来支持getter / setter而不需要后备字段?

我有一个通用的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的实例,但是我有一些约束:

  • 我无法将Spring注释添加到基类(但我可以继承 Thing 并注释它) .

  • 我想使用 name 字段作为Mongodb唯一ID(主要是为了避免为它创建单独的唯一索引) .

  • 我想(冗余地)将 name 字段存储为名为"name"的实际字段,以便集合的其他使用者不必知道"name"存储在 _id 中 .

我开始尝试这个:

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

这会导致spring为 _id 使用 name 的值,但当然它不会在Mongodb中存储名为"name"的字段 . The documentation表示spring将使用名为"id"的"property or field"或使用 @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)

3 years ago

感谢@ 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 字段 .