你能阻止 spring-data 持久化在超类中声明的字段吗?



我有一个域对象,它扩展了一个包含多个私有字段(用瞬态关键字标记(的基类。 我想防止超类字段被持久化。 不幸的是,我无法控制基类(它位于第三方库中(。 由于第三方库的机制,我也没有选择,只能使用继承。

有没有办法告诉弹簧数据:

  1. 仅保留在子类中声明的字段。

  2. 仅保留已显式批注@Field该域对象的字段?

  3. 忽略标有瞬态关键字的字段?

我尝试将 @AccessType(Type.PROPERTY( 与子类中的@Override方法一起使用,用于我不想保留的超类中的方法,并用@Transient注释这些方法。 但是,它似乎仍然对超类中的某些字段使用字段访问。

编辑:我想知道是否可以编写一个通用转换器,以反射方式查找子类中的字段。 但是,我不确定如何将 Spring 配置为将该转换器仅用于固定的类集合。

@barbakini感谢您建议使用转换器。我尝试了这种方法,但它似乎比预期的要棘手一些。

我有一个有效的解决方案是使用AbstractMongoEventListener,它过滤掉onBeforeSave((中不需要的字段:

public class ConfigurableFieldFilteringMongoSaveEventListener extends AbstractMongoEventListener<Object> {
private final Map<Class<?>, Collection<String>> allowedFieldsByClass;
public ConfigurableFieldFilteringMongoSaveEventListener(Map<Class<?>, Collection<String>> allowedFieldsByClass) {
this.allowedFieldsByClass = allowedFieldsByClass;
}
@Override
public void onBeforeSave(BeforeSaveEvent<Object> event) {
super.onBeforeSave(event);
final Object domainObject = event.getSource();
final Collection<String> allowedFields = allowedFieldsByClass.get(domainObject.getClass());
if (allowedFields == null) {
return;
}
final DBObject dbObject = event.getDBObject();
dbObject.keySet().retainAll(allowedFields);
}
}

是的,您可以为您的类编写和使用自定义转换器,甚至可以像这样将不同的字段名称从对象映射到 mongodb 集合:

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {
private final List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>();
public CustomConversions customConversions() {
converters.add(new YourCustomConverter());
return new CustomConversions(converters);
}
}

和你的自定义转换器类:

@WritingConverter 
public class CandidateConverter implements Converter<DBObject, YourClass> {
@Override
public DBObject convert(YourClass object) {
DBObject dbo = new BasicDBObject();
dbo.put("_id", object.get_id);
dbo.put("iAmNotSomeField", object.getSomeField);
return dbo;
}
}

对于子对象字段,您需要创建 DBObject 并将其放在上部 DBObject 中。同样,如果你愿意,你也可以写一个阅读转换器。您可以在第 6.3.6 节中找到更多信息

更新:

对于我在评论中提出的建议。Spring 使用 MappingMongoConverter 在课堂上您可以搜索转换和转换服务

最新更新