Skip to content

Commit 80b787d

Browse files
feat: add MapperType enum and mapper() config option (#4192)
- Create MapperType enum (LEGACY, CRITTER) in dev.morphia.mapping - Add mapper() method to MorphiaConfig interface with default LEGACY - Add mapper field to ManualMorphiaConfig with getter and copy constructor support - Update ManualMorphiaConfig.toString() to include mapper field Implements task 1 (MapperType enum) and task 2 (mapper() config) from issue #4184. Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
1 parent c21a6d1 commit 80b787d

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

core/src/main/java/dev/morphia/config/ManualMorphiaConfig.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import dev.morphia.mapping.DateStorage;
1010
import dev.morphia.mapping.DiscriminatorFunction;
11+
import dev.morphia.mapping.MapperType;
1112
import dev.morphia.mapping.NamingStrategy;
1213
import dev.morphia.mapping.PropertyDiscovery;
1314
import dev.morphia.query.DefaultQueryFactory;
@@ -43,6 +44,7 @@ public class ManualMorphiaConfig implements MorphiaConfig {
4344
String discriminatorKey;
4445
Boolean enablePolymorphicQueries;
4546
Boolean ignoreFinals;
47+
MapperType mapper;
4648
List<String> packages;
4749
PropertyDiscovery propertyDiscovery;
4850
List<PropertyAnnotationProvider<?>> propertyAnnotationProviders;
@@ -72,6 +74,7 @@ public ManualMorphiaConfig(MorphiaConfig base) {
7274
discriminatorKey = base.discriminatorKey();
7375
enablePolymorphicQueries = base.enablePolymorphicQueries();
7476
ignoreFinals = base.ignoreFinals();
77+
mapper = base.mapper();
7578
packages = new ArrayList<>(base.packages());
7679
propertyDiscovery = base.propertyDiscovery();
7780
propertyNaming = base.propertyNaming();
@@ -99,11 +102,11 @@ public static ManualMorphiaConfig configure(MorphiaConfig base) {
99102
public String toString() {
100103
return ("MorphiaConfig{applyCaps=%s, applyDocumentValidations=%s, applyIndexes=%s, database='%s', codecProvider=%s, " +
101104
"collectionNaming=%s, dateStorage=%s, discriminator=%s, discriminatorKey='%s', enablePolymorphicQueries=%s, " +
102-
"ignoreFinals=%s, packages=%s, propertyDiscovery=%s, propertyNaming=%s, queryFactory=%s, " +
105+
"ignoreFinals=%s, mapper=%s, packages=%s, propertyDiscovery=%s, propertyNaming=%s, queryFactory=%s, " +
103106
"storeEmpties=%s, storeNulls=%s}").formatted(
104107
applyCaps(), applyDocumentValidations(), applyIndexes(), database(), codecProvider(), collectionNaming(),
105-
dateStorage(), discriminator(), discriminatorKey(), enablePolymorphicQueries(), ignoreFinals(), packages(),
106-
propertyDiscovery(), propertyNaming(), queryFactory(), storeEmpties(), storeNulls());
108+
dateStorage(), discriminator(), discriminatorKey(), enablePolymorphicQueries(), ignoreFinals(), mapper(),
109+
packages(), propertyDiscovery(), propertyNaming(), queryFactory(), storeEmpties(), storeNulls());
107110
}
108111

109112
@Override
@@ -160,6 +163,11 @@ public Boolean ignoreFinals() {
160163
return orDefault(ignoreFinals, FALSE);
161164
}
162165

166+
@Override
167+
public MapperType mapper() {
168+
return orDefault(mapper, MapperType.LEGACY);
169+
}
170+
163171
@Override
164172
public List<String> packages() {
165173
return orDefault(packages, List.of());

core/src/main/java/dev/morphia/config/MorphiaConfig.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import dev.morphia.config.converters.QueryFactoryConverter;
1717
import dev.morphia.mapping.DateStorage;
1818
import dev.morphia.mapping.DiscriminatorFunction;
19+
import dev.morphia.mapping.MapperType;
1920
import dev.morphia.mapping.NamingStrategy;
2021
import dev.morphia.mapping.PropertyDiscovery;
2122
import dev.morphia.query.QueryFactory;
@@ -357,6 +358,30 @@ default MorphiaConfig legacy() {
357358

358359
}
359360

361+
/**
362+
* The mapper implementation to use. Defaults to {@link MapperType#LEGACY} (reflection-based).
363+
* Set to {@link MapperType#CRITTER} to use the bytecode-generated mapper (requires critter dependencies).
364+
*
365+
* @return the mapper type to use
366+
* @since 3.0
367+
*/
368+
@WithDefault("legacy")
369+
MapperType mapper();
370+
371+
/**
372+
* Updates this configuration with a new value and returns a new instance. The original instance is unchanged.
373+
*
374+
* @param value the new value
375+
* @return a new instance with the updated configuration
376+
* @since 3.0
377+
*/
378+
default MorphiaConfig mapper(MapperType value) {
379+
var newConfig = new ManualMorphiaConfig(this);
380+
381+
newConfig.mapper = value;
382+
return newConfig;
383+
}
384+
360385
/**
361386
* A comma delimited list of packages that Morphia should map. If subpackages of a specific package should also be mapped, simply add
362387
* a '*' to the end of the package name. e.g., 'com.foo.bar.*'
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.morphia.mapping;
2+
3+
/**
4+
* Selects the mapper implementation Morphia uses to map entity classes.
5+
*
6+
* @since 3.0
7+
*/
8+
public enum MapperType {
9+
/**
10+
* The default reflection-based mapper.
11+
*/
12+
LEGACY,
13+
14+
/**
15+
* The bytecode-generated mapper using critter. Requires critter dependencies on the classpath.
16+
*/
17+
CRITTER
18+
}

0 commit comments

Comments
 (0)