Polishing.
Adopt to Framework changes. Simplify auditing bean registration. Remove ImportRuntimeHints in EnableMongoAuditing. Refine ManagedTypes bean definitions. Consistently use mongo as bean name prefix. Depend on store-specific ManagedTypes. Rewrite ReactiveMongoAuditingRegistrar to avoid inner beans. Reduce AOT processor visibility. Cleanup imports. Improve type naming. Update Javadoc. Original Pull Request: #4093
This commit is contained in:
committed by
Christoph Strobl
parent
cfd55be95b
commit
d334c5a44c
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.mongodb;
|
package org.springframework.data.mongodb;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import org.springframework.data.domain.ManagedTypes;
|
import org.springframework.data.domain.ManagedTypes;
|
||||||
@@ -27,19 +28,49 @@ public final class MongoManagedTypes implements ManagedTypes {
|
|||||||
|
|
||||||
private final ManagedTypes delegate;
|
private final ManagedTypes delegate;
|
||||||
|
|
||||||
public MongoManagedTypes(ManagedTypes types) {
|
private MongoManagedTypes(ManagedTypes types) {
|
||||||
this.delegate = types;
|
this.delegate = types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps an existing {@link ManagedTypes} object with {@link MongoManagedTypes}.
|
||||||
|
*
|
||||||
|
* @param managedTypes
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public static MongoManagedTypes from(ManagedTypes managedTypes) {
|
public static MongoManagedTypes from(ManagedTypes managedTypes) {
|
||||||
return new MongoManagedTypes(managedTypes);
|
return new MongoManagedTypes(managedTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MongoManagedTypes of(Iterable<? extends Class<?>> types) {
|
/**
|
||||||
|
* Factory method used to construct {@link MongoManagedTypes} from the given array of {@link Class types}.
|
||||||
|
*
|
||||||
|
* @param types array of {@link Class types} used to initialize the {@link ManagedTypes}; must not be {@literal null}.
|
||||||
|
* @return new instance of {@link MongoManagedTypes} initialized from {@link Class types}.
|
||||||
|
*/
|
||||||
|
public static MongoManagedTypes from(Class<?>... types) {
|
||||||
|
return fromIterable(Arrays.asList(types));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory method used to construct {@link MongoManagedTypes} from the given, required {@link Iterable} of
|
||||||
|
* {@link Class types}.
|
||||||
|
*
|
||||||
|
* @param types {@link Iterable} of {@link Class types} used to initialize the {@link ManagedTypes}; must not be
|
||||||
|
* {@literal null}.
|
||||||
|
* @return new instance of {@link MongoManagedTypes} initialized the given, required {@link Iterable} of {@link Class
|
||||||
|
* types}.
|
||||||
|
*/
|
||||||
|
public static MongoManagedTypes fromIterable(Iterable<? extends Class<?>> types) {
|
||||||
return from(ManagedTypes.fromIterable(types));
|
return from(ManagedTypes.fromIterable(types));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MongoManagedTypes none() {
|
/**
|
||||||
|
* Factory method to return an empty {@link MongoManagedTypes} object.
|
||||||
|
*
|
||||||
|
* @return an empty {@link MongoManagedTypes} object.
|
||||||
|
*/
|
||||||
|
public static MongoManagedTypes empty() {
|
||||||
return from(ManagedTypes.empty());
|
return from(ManagedTypes.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes;
|
|||||||
*/
|
*/
|
||||||
public class AotMongoRepositoryPostProcessor extends RepositoryRegistrationAotProcessor {
|
public class AotMongoRepositoryPostProcessor extends RepositoryRegistrationAotProcessor {
|
||||||
|
|
||||||
private LazyLoadingProxyAotProcessor lazyLoadingProxyAotProcessor = new LazyLoadingProxyAotProcessor();
|
private final LazyLoadingProxyAotProcessor lazyLoadingProxyAotProcessor = new LazyLoadingProxyAotProcessor();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void contribute(AotRepositoryContext repositoryContext, GenerationContext generationContext) {
|
protected void contribute(AotRepositoryContext repositoryContext, GenerationContext generationContext) {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ import org.springframework.data.mongodb.core.mapping.DocumentReference;
|
|||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public class LazyLoadingProxyAotProcessor {
|
class LazyLoadingProxyAotProcessor {
|
||||||
|
|
||||||
private boolean generalLazyLoadingProxyContributed = false;
|
private boolean generalLazyLoadingProxyContributed = false;
|
||||||
|
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ import org.springframework.util.ClassUtils;
|
|||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
* @since 2022/06
|
* @since 2022/06
|
||||||
*/
|
*/
|
||||||
public class MongoManagedTypesBeanRegistrationAotProcessor extends ManagedTypesBeanRegistrationAotProcessor {
|
class MongoManagedTypesBeanRegistrationAotProcessor extends ManagedTypesBeanRegistrationAotProcessor {
|
||||||
|
|
||||||
private LazyLoadingProxyAotProcessor lazyLoadingProxyAotProcessor = new LazyLoadingProxyAotProcessor();
|
private final LazyLoadingProxyAotProcessor lazyLoadingProxyAotProcessor = new LazyLoadingProxyAotProcessor();
|
||||||
|
|
||||||
public MongoManagedTypesBeanRegistrationAotProcessor() {
|
public MongoManagedTypesBeanRegistrationAotProcessor() {
|
||||||
setModuleIdentifier("mongo");
|
setModuleIdentifier("mongo");
|
||||||
|
|||||||
@@ -25,14 +25,26 @@ import org.springframework.data.mongodb.core.mapping.event.AfterConvertCallback;
|
|||||||
import org.springframework.data.mongodb.core.mapping.event.AfterSaveCallback;
|
import org.springframework.data.mongodb.core.mapping.event.AfterSaveCallback;
|
||||||
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertCallback;
|
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertCallback;
|
||||||
import org.springframework.data.mongodb.core.mapping.event.BeforeSaveCallback;
|
import org.springframework.data.mongodb.core.mapping.event.BeforeSaveCallback;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterConvertCallback;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterSaveCallback;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.event.ReactiveBeforeConvertCallback;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.event.ReactiveBeforeSaveCallback;
|
||||||
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
|
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
|
||||||
|
import org.springframework.data.mongodb.repository.support.SimpleReactiveMongoRepository;
|
||||||
|
import org.springframework.data.repository.util.ReactiveWrappers;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* {@link RuntimeHintsRegistrar} for repository types and entity callbacks.
|
||||||
|
*
|
||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
|
* @author Mark Paluch
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public class DataMongoRuntimeHints implements RuntimeHintsRegistrar {
|
class MongoRuntimeHints implements RuntimeHintsRegistrar {
|
||||||
|
|
||||||
|
private static final boolean PROJECT_REACTOR_PRESENT = ReactiveWrappers
|
||||||
|
.isAvailable(ReactiveWrappers.ReactiveLibrary.PROJECT_REACTOR);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) {
|
public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) {
|
||||||
@@ -43,5 +55,15 @@ public class DataMongoRuntimeHints implements RuntimeHintsRegistrar {
|
|||||||
TypeReference.of(AfterSaveCallback.class)),
|
TypeReference.of(AfterSaveCallback.class)),
|
||||||
builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
|
builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
|
||||||
MemberCategory.INVOKE_PUBLIC_METHODS));
|
MemberCategory.INVOKE_PUBLIC_METHODS));
|
||||||
|
|
||||||
|
if (PROJECT_REACTOR_PRESENT) {
|
||||||
|
|
||||||
|
hints.reflection()
|
||||||
|
.registerTypes(Arrays.asList(TypeReference.of(SimpleReactiveMongoRepository.class),
|
||||||
|
TypeReference.of(ReactiveBeforeConvertCallback.class), TypeReference.of(ReactiveBeforeSaveCallback.class),
|
||||||
|
TypeReference.of(ReactiveAfterConvertCallback.class), TypeReference.of(ReactiveAfterSaveCallback.class)),
|
||||||
|
builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
|
||||||
|
MemberCategory.INVOKE_PUBLIC_METHODS));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -80,10 +80,10 @@ public abstract class AbstractMongoClientConfiguration extends MongoConfiguratio
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link MappingMongoConverter} using the configured {@link #mongoDbFactory()} and
|
* Creates a {@link MappingMongoConverter} using the configured {@link #mongoDbFactory()} and
|
||||||
* {@link #mongoMappingContext(MongoCustomConversions)}. Will get {@link #customConversions()} applied.
|
* {@link #mongoMappingContext(MongoCustomConversions, org.springframework.data.mongodb.MongoManagedTypes)}. Will get {@link #customConversions()} applied.
|
||||||
*
|
*
|
||||||
* @see #customConversions()
|
* @see #customConversions()
|
||||||
* @see #mongoMappingContext(MongoCustomConversions)
|
* @see #mongoMappingContext(MongoCustomConversions, org.springframework.data.mongodb.MongoManagedTypes)
|
||||||
* @see #mongoDbFactory()
|
* @see #mongoDbFactory()
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
|
|||||||
@@ -84,10 +84,10 @@ public abstract class AbstractReactiveMongoConfiguration extends MongoConfigurat
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link MappingMongoConverter} using the configured {@link #reactiveMongoDbFactory()} and
|
* Creates a {@link MappingMongoConverter} using the configured {@link #reactiveMongoDbFactory()} and
|
||||||
* {@link #mongoMappingContext(MongoCustomConversions)}. Will get {@link #customConversions()} applied.
|
* {@link #mongoMappingContext(MongoCustomConversions, org.springframework.data.mongodb.MongoManagedTypes)}. Will get {@link #customConversions()} applied.
|
||||||
*
|
*
|
||||||
* @see #customConversions()
|
* @see #customConversions()
|
||||||
* @see #mongoMappingContext(MongoCustomConversions)
|
* @see #mongoMappingContext(MongoCustomConversions, org.springframework.data.mongodb.MongoManagedTypes)
|
||||||
* @see #reactiveMongoDbFactory()
|
* @see #reactiveMongoDbFactory()
|
||||||
* @return never {@literal null}.
|
* @return never {@literal null}.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ import java.lang.annotation.RetentionPolicy;
|
|||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
import org.springframework.context.annotation.ImportRuntimeHints;
|
|
||||||
import org.springframework.data.aot.hint.AuditingHints;
|
|
||||||
import org.springframework.data.auditing.DateTimeProvider;
|
import org.springframework.data.auditing.DateTimeProvider;
|
||||||
import org.springframework.data.domain.AuditorAware;
|
import org.springframework.data.domain.AuditorAware;
|
||||||
|
|
||||||
@@ -39,7 +37,6 @@ import org.springframework.data.domain.AuditorAware;
|
|||||||
@Target(ElementType.TYPE)
|
@Target(ElementType.TYPE)
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Import(MongoAuditingRegistrar.class)
|
@Import(MongoAuditingRegistrar.class)
|
||||||
@ImportRuntimeHints(AuditingHints.AuditingRuntimeHints.class)
|
|
||||||
public @interface EnableMongoAuditing {
|
public @interface EnableMongoAuditing {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -17,20 +17,20 @@ package org.springframework.data.mongodb.config;
|
|||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.ListableBeanFactory;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
|
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
|
||||||
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
import org.springframework.core.type.AnnotationMetadata;
|
|
||||||
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
|
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
|
||||||
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
|
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
|
||||||
import org.springframework.data.auditing.config.AuditingConfiguration;
|
import org.springframework.data.auditing.config.AuditingConfiguration;
|
||||||
import org.springframework.data.config.ParsingUtils;
|
import org.springframework.data.config.ParsingUtils;
|
||||||
import org.springframework.data.mapping.context.PersistentEntities;
|
import org.springframework.data.mapping.context.PersistentEntities;
|
||||||
import org.springframework.data.mongodb.core.mapping.event.AuditingEntityCallback;
|
import org.springframework.data.mongodb.core.mapping.event.AuditingEntityCallback;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,35 +52,10 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport impl
|
|||||||
return "mongoAuditingHandler";
|
return "mongoAuditingHandler";
|
||||||
}
|
}
|
||||||
|
|
||||||
String persistentEntitiesBeanName;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
|
protected void postProcess(BeanDefinitionBuilder builder, AuditingConfiguration configuration,
|
||||||
|
BeanDefinitionRegistry registry) {
|
||||||
Assert.notNull(annotationMetadata, "AnnotationMetadata must not be null");
|
potentiallyRegisterMongoPersistentEntities(builder, registry);
|
||||||
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
|
|
||||||
|
|
||||||
if(persistentEntitiesBeanName == null) {
|
|
||||||
if (registry instanceof DefaultListableBeanFactory beanFactory) {
|
|
||||||
for (String bn : beanFactory.getBeanNamesForType(PersistentEntities.class)) {
|
|
||||||
if (bn.startsWith("mongo")) {
|
|
||||||
persistentEntitiesBeanName = bn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(persistentEntitiesBeanName == null) {
|
|
||||||
|
|
||||||
persistentEntitiesBeanName = BeanDefinitionReaderUtils.uniqueBeanName("mongo.persistent-entities", registry);
|
|
||||||
|
|
||||||
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(PersistentEntities.class)
|
|
||||||
.setFactoryMethod("of")
|
|
||||||
//.addConstructorArgValue(new RuntimeBeanReference(MongoMappingContext.class))
|
|
||||||
.addConstructorArgReference("mongoMappingContext");
|
|
||||||
registry.registerBeanDefinition(persistentEntitiesBeanName, definition.getBeanDefinition());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
super.registerBeanDefinitions(annotationMetadata, registry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -88,9 +63,8 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport impl
|
|||||||
|
|
||||||
Assert.notNull(configuration, "AuditingConfiguration must not be null");
|
Assert.notNull(configuration, "AuditingConfiguration must not be null");
|
||||||
|
|
||||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class);
|
return configureDefaultAuditHandlerAttributes(configuration,
|
||||||
builder.addConstructorArgReference(persistentEntitiesBeanName);
|
BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class));
|
||||||
return configureDefaultAuditHandlerAttributes(configuration, builder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -109,9 +83,42 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport impl
|
|||||||
AuditingEntityCallback.class.getName(), registry);
|
AuditingEntityCallback.class.getName(), registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getOrder() {
|
public int getOrder() {
|
||||||
return Ordered.LOWEST_PRECEDENCE;
|
return Ordered.LOWEST_PRECEDENCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void potentiallyRegisterMongoPersistentEntities(BeanDefinitionBuilder builder,
|
||||||
|
BeanDefinitionRegistry registry) {
|
||||||
|
|
||||||
|
String persistentEntitiesBeanName = MongoAuditingRegistrar.detectPersistentEntitiesBeanName(registry);
|
||||||
|
|
||||||
|
if (persistentEntitiesBeanName == null) {
|
||||||
|
|
||||||
|
persistentEntitiesBeanName = BeanDefinitionReaderUtils.uniqueBeanName("mongoPersistentEntities", registry);
|
||||||
|
|
||||||
|
// TODO: https://github.com/spring-projects/spring-framework/issues/28728
|
||||||
|
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(PersistentEntities.class) //
|
||||||
|
.setFactoryMethod("of") //
|
||||||
|
.addConstructorArgReference("mongoMappingContext");
|
||||||
|
|
||||||
|
registry.registerBeanDefinition(persistentEntitiesBeanName, definition.getBeanDefinition());
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.addConstructorArgReference(persistentEntitiesBeanName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static String detectPersistentEntitiesBeanName(BeanDefinitionRegistry registry) {
|
||||||
|
|
||||||
|
if (registry instanceof ListableBeanFactory beanFactory) {
|
||||||
|
for (String bn : beanFactory.getBeanNamesForType(PersistentEntities.class)) {
|
||||||
|
if (bn.startsWith("mongo")) {
|
||||||
|
return bn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,14 +78,13 @@ public abstract class MongoConfigurationSupport {
|
|||||||
*
|
*
|
||||||
* @see #getMappingBasePackages()
|
* @see #getMappingBasePackages()
|
||||||
* @return
|
* @return
|
||||||
* @throws ClassNotFoundException
|
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public MongoMappingContext mongoMappingContext(MongoCustomConversions customConversions, ManagedTypes managedTypes)
|
public MongoMappingContext mongoMappingContext(MongoCustomConversions customConversions,
|
||||||
throws ClassNotFoundException {
|
MongoManagedTypes mongoManagedTypes) {
|
||||||
|
|
||||||
MongoMappingContext mappingContext = new MongoMappingContext();
|
MongoMappingContext mappingContext = new MongoMappingContext();
|
||||||
mappingContext.setManagedTypes(managedTypes);
|
mappingContext.setManagedTypes(mongoManagedTypes);
|
||||||
mappingContext.setSimpleTypeHolder(customConversions.getSimpleTypeHolder());
|
mappingContext.setSimpleTypeHolder(customConversions.getSimpleTypeHolder());
|
||||||
mappingContext.setFieldNamingStrategy(fieldNamingStrategy());
|
mappingContext.setFieldNamingStrategy(fieldNamingStrategy());
|
||||||
mappingContext.setAutoIndexCreation(autoIndexCreation());
|
mappingContext.setAutoIndexCreation(autoIndexCreation());
|
||||||
@@ -99,8 +98,8 @@ public abstract class MongoConfigurationSupport {
|
|||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public MongoManagedTypes managedTypes() throws ClassNotFoundException {
|
public MongoManagedTypes mongoManagedTypes() throws ClassNotFoundException {
|
||||||
return MongoManagedTypes.of(getInitialEntitySet());
|
return MongoManagedTypes.fromIterable(getInitialEntitySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -18,11 +18,9 @@ package org.springframework.data.mongodb.config;
|
|||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||||
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
||||||
import org.springframework.core.type.AnnotationMetadata;
|
|
||||||
import org.springframework.data.auditing.ReactiveIsNewAwareAuditingHandler;
|
import org.springframework.data.auditing.ReactiveIsNewAwareAuditingHandler;
|
||||||
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
|
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
|
||||||
import org.springframework.data.auditing.config.AuditingConfiguration;
|
import org.springframework.data.auditing.config.AuditingConfiguration;
|
||||||
@@ -48,18 +46,19 @@ class ReactiveMongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupp
|
|||||||
return "reactiveMongoAuditingHandler";
|
return "reactiveMongoAuditingHandler";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void postProcess(BeanDefinitionBuilder builder, AuditingConfiguration configuration,
|
||||||
|
BeanDefinitionRegistry registry) {
|
||||||
|
MongoAuditingRegistrar.potentiallyRegisterMongoPersistentEntities(builder, registry);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) {
|
protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) {
|
||||||
|
|
||||||
Assert.notNull(configuration, "AuditingConfiguration must not be null");
|
Assert.notNull(configuration, "AuditingConfiguration must not be null");
|
||||||
|
|
||||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(ReactiveIsNewAwareAuditingHandler.class);
|
return configureDefaultAuditHandlerAttributes(configuration,
|
||||||
|
BeanDefinitionBuilder.rootBeanDefinition(ReactiveIsNewAwareAuditingHandler.class));
|
||||||
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(PersistentEntitiesFactoryBean.class);
|
|
||||||
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
|
|
||||||
|
|
||||||
builder.addConstructorArgValue(definition.getBeanDefinition());
|
|
||||||
return configureDefaultAuditHandlerAttributes(configuration, builder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import org.springframework.data.repository.config.AnnotationRepositoryConfigurat
|
|||||||
import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport;
|
import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport;
|
||||||
import org.springframework.data.repository.config.XmlRepositoryConfigurationSource;
|
import org.springframework.data.repository.config.XmlRepositoryConfigurationSource;
|
||||||
import org.springframework.data.repository.core.RepositoryMetadata;
|
import org.springframework.data.repository.core.RepositoryMetadata;
|
||||||
import org.springframework.lang.NonNull;
|
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
org.springframework.aot.hint.RuntimeHintsRegistrar=\
|
org.springframework.aot.hint.RuntimeHintsRegistrar=\
|
||||||
org.springframework.data.mongodb.aot.DataMongoRuntimeHints
|
org.springframework.data.mongodb.aot.MongoRuntimeHints
|
||||||
|
|
||||||
org.springframework.beans.factory.aot.BeanRegistrationAotProcessor=\
|
org.springframework.beans.factory.aot.BeanRegistrationAotProcessor=\
|
||||||
org.springframework.data.mongodb.aot.MongoManagedTypesBeanRegistrationAotProcessor
|
org.springframework.data.mongodb.aot.MongoManagedTypesBeanRegistrationAotProcessor
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ public class RepositoryRegistrationAotContributionAssert
|
|||||||
BeanRegistrationCode mockBeanRegistrationCode = mock(BeanRegistrationCode.class);
|
BeanRegistrationCode mockBeanRegistrationCode = mock(BeanRegistrationCode.class);
|
||||||
|
|
||||||
DefaultGenerationContext generationContext =
|
DefaultGenerationContext generationContext =
|
||||||
new DefaultGenerationContext(new ClassNameGenerator(), new InMemoryGeneratedFiles(), new RuntimeHints());
|
new DefaultGenerationContext(new ClassNameGenerator(Object.class), new InMemoryGeneratedFiles());
|
||||||
|
|
||||||
this.actual.applyTo(generationContext, mockBeanRegistrationCode);
|
this.actual.applyTo(generationContext, mockBeanRegistrationCode);
|
||||||
|
|
||||||
|
|||||||
@@ -93,7 +93,8 @@ public class AbstractMongoConfigurationUnitTests {
|
|||||||
public void returnsUninitializedMappingContext() throws Exception {
|
public void returnsUninitializedMappingContext() throws Exception {
|
||||||
|
|
||||||
SampleMongoConfiguration configuration = new SampleMongoConfiguration();
|
SampleMongoConfiguration configuration = new SampleMongoConfiguration();
|
||||||
MongoMappingContext context = configuration.mongoMappingContext(configuration.customConversions(), MongoManagedTypes.of(Collections.singleton(Entity.class)));
|
MongoMappingContext context = configuration.mongoMappingContext(configuration.customConversions(),
|
||||||
|
MongoManagedTypes.from(Entity.class));
|
||||||
|
|
||||||
assertThat(context.getPersistentEntities()).isEmpty();
|
assertThat(context.getPersistentEntities()).isEmpty();
|
||||||
context.initialize();
|
context.initialize();
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
@@ -38,7 +39,6 @@ import org.springframework.data.mongodb.core.SimpleReactiveMongoDatabaseFactory;
|
|||||||
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
||||||
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
|
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
|
||||||
import org.springframework.data.mongodb.core.convert.MongoTypeMapper;
|
import org.springframework.data.mongodb.core.convert.MongoTypeMapper;
|
||||||
import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity;
|
|
||||||
import org.springframework.data.mongodb.core.mapping.Document;
|
import org.springframework.data.mongodb.core.mapping.Document;
|
||||||
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
|
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
|
||||||
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
|
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
|
||||||
@@ -93,7 +93,8 @@ public class AbstractReactiveMongoConfigurationUnitTests {
|
|||||||
public void returnsUninitializedMappingContext() throws Exception {
|
public void returnsUninitializedMappingContext() throws Exception {
|
||||||
|
|
||||||
SampleMongoConfiguration configuration = new SampleMongoConfiguration();
|
SampleMongoConfiguration configuration = new SampleMongoConfiguration();
|
||||||
MongoMappingContext context = configuration.mongoMappingContext(configuration.customConversions(), MongoManagedTypes.of(Collections.singleton(Entity.class)));
|
MongoMappingContext context = configuration.mongoMappingContext(configuration.customConversions(),
|
||||||
|
MongoManagedTypes.from(Entity.class));
|
||||||
|
|
||||||
assertThat(context.getPersistentEntities()).isEmpty();
|
assertThat(context.getPersistentEntities()).isEmpty();
|
||||||
context.initialize();
|
context.initialize();
|
||||||
|
|||||||
Reference in New Issue
Block a user