我在深入研究后自己弄清楚了。我在core 项目中停用了org.springframework.data.annotation.@Version 的任何用法,并将其替换为我自己的名为@EnabledOptimisticLocking 的注释。为了让spring.data.mongodb 提防它而不是@Version,您需要执行以下操作:
public class CustomVersionAnnotationMappingContext extends MongoMappingContext {
private static final FieldNamingStrategy DEFAULT_NAMING_STRATEGY = PropertyNameFieldNamingStrategy.INSTANCE;
private FieldNamingStrategy fieldNamingStrategy = DEFAULT_NAMING_STRATEGY;
@Override
public MongoPersistentProperty createPersistentProperty(Property property, BasicMongoPersistentEntity<?> owner,
SimpleTypeHolder simpleTypeHolder) {
return new CustomVersionAnnotationPersistentProperty(property, owner, simpleTypeHolder, fieldNamingStrategy);
}
@Override
public void setFieldNamingStrategy(FieldNamingStrategy fieldNamingStrategy) {
super.setFieldNamingStrategy(fieldNamingStrategy);
this.fieldNamingStrategy = fieldNamingStrategy == null ? DEFAULT_NAMING_STRATEGY : fieldNamingStrategy;
}
class CustomVersionAnnotationPersistentProperty extends CachingMongoPersistentProperty {
/**
* Creates a new {@link CachingMongoPersistentProperty}.
*
* @param property
* @param owner
* @param simpleTypeHolder
* @param fieldNamingStrategy
*/
public CustomVersionAnnotationPersistentProperty(Property property,
MongoPersistentEntity<?> owner,
SimpleTypeHolder simpleTypeHolder,
FieldNamingStrategy fieldNamingStrategy) {
super(property, owner, simpleTypeHolder, fieldNamingStrategy);
}
@Override
public boolean isVersionProperty() {
return isAnnotationPresent(EnableOptimisticLocking.class);
}
}
}
然后简单地将其初始化为默认的 bean 之前,否则将创建:
@Bean
public MongoMappingContext mongoMappingContext(@Autowired CustomConversions customConversions) throws ClassNotFoundException {
MongoMappingContext mappingContext = new CustomVersionAnnotationMappingContext();
mappingContext.setSimpleTypeHolder(customConversions.getSimpleTypeHolder());
mappingContext.setAutoIndexCreation(true);
mappingContext.afterPropertiesSet();
return mappingContext;
}
不幸的是,fieldNamingStrategy 类属性是私有的,并且没有 getter,因此需要将该字段拉起并复制它。
理论上,如果需要,现在也可以用您自己的注释替换其他注释,例如@Id。