diff --git a/core/src/main/java/org/mapstruct/MappingConstants.java b/core/src/main/java/org/mapstruct/MappingConstants.java
index ce2438298..3d3d8a4c7 100644
--- a/core/src/main/java/org/mapstruct/MappingConstants.java
+++ b/core/src/main/java/org/mapstruct/MappingConstants.java
@@ -109,7 +109,12 @@ public final class MappingConstants {
public static final String DEFAULT = "default";
/**
- * The generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
+ * The generated mapper is an application-scoped CDI bean and can be retrieved via @Inject.
+ * The annotations are either from {@code javax} or {@code jakarta}.
+ * Priority have the {@code javax} annotations.
+ * In case you want to only use Jakarta then use {@link #JAKARTA_CDI}.
+ *
+ * @see #JAKARTA_CDI
*/
public static final String CDI = "cdi";
@@ -138,6 +143,12 @@ public final class MappingConstants {
*/
public static final String JAKARTA = "jakarta";
+ /**
+ * The generated mapper is an application-scoped Jakarta CDI bean and can be retrieved via @Inject.
+ * @see #CDI
+ */
+ public static final String JAKARTA_CDI = "jakarta-cdi";
+
}
}
diff --git a/integrationtest/src/test/resources/fullFeatureTest/pom.xml b/integrationtest/src/test/resources/fullFeatureTest/pom.xml
index ec26f45ce..62f7986e9 100644
--- a/integrationtest/src/test/resources/fullFeatureTest/pom.xml
+++ b/integrationtest/src/test/resources/fullFeatureTest/pom.xml
@@ -64,6 +64,10 @@
jakarta.inject
jakarta.inject-api
+
+ jakarta.enterprise
+ jakarta.enterprise.cdi-api
+
diff --git a/parent/pom.xml b/parent/pom.xml
index ea2ee0b34..dfaf388b1 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -160,6 +160,11 @@
cdi-api
2.0.SP1
+
+ jakarta.enterprise
+ jakarta.enterprise.cdi-api
+ 4.0.1
+
javax.inject
javax.inject
diff --git a/processor/pom.xml b/processor/pom.xml
index 83482e850..3767a5a99 100644
--- a/processor/pom.xml
+++ b/processor/pom.xml
@@ -89,6 +89,11 @@
jakarta.inject-api
test
+
+ jakarta.enterprise
+ jakarta.enterprise.cdi-api
+ test
+
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/gem/MappingConstantsGem.java b/processor/src/main/java/org/mapstruct/ap/internal/gem/MappingConstantsGem.java
index cb6d49c0c..bc58024ca 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/gem/MappingConstantsGem.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/gem/MappingConstantsGem.java
@@ -51,6 +51,8 @@ public final class MappingConstantsGem {
public static final String JSR330 = "jsr330";
public static final String JAKARTA = "jakarta";
+
+ public static final String JAKARTA_CDI = "jakarta-cdi";
}
}
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/processor/CdiComponentProcessor.java b/processor/src/main/java/org/mapstruct/ap/internal/processor/CdiComponentProcessor.java
index 74ff2b118..d8f136034 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/processor/CdiComponentProcessor.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/processor/CdiComponentProcessor.java
@@ -12,6 +12,8 @@ import java.util.List;
import org.mapstruct.ap.internal.gem.MappingConstantsGem;
import org.mapstruct.ap.internal.model.Annotation;
import org.mapstruct.ap.internal.model.Mapper;
+import org.mapstruct.ap.internal.model.common.Type;
+import org.mapstruct.ap.internal.util.AnnotationProcessingException;
/**
* A {@link ModelElementProcessor} which converts the given {@link Mapper}
@@ -30,13 +32,13 @@ public class CdiComponentProcessor extends AnnotationBasedComponentModelProcesso
@Override
protected List getTypeAnnotations(Mapper mapper) {
return Collections.singletonList(
- new Annotation( getTypeFactory().getType( "javax.enterprise.context.ApplicationScoped" ) )
+ new Annotation( getType( "ApplicationScoped" ) )
);
}
@Override
protected List getMapperReferenceAnnotations() {
- return Arrays.asList( new Annotation( getTypeFactory().getType( "javax.inject.Inject" ) ) );
+ return Arrays.asList( new Annotation( getType( "Inject" ) ) );
}
@Override
@@ -48,4 +50,24 @@ public class CdiComponentProcessor extends AnnotationBasedComponentModelProcesso
protected boolean additionalPublicEmptyConstructor() {
return true;
}
+
+ private Type getType(String simpleName) {
+ String javaxPrefix = "javax.inject.";
+ String jakartaPrefix = "jakarta.inject.";
+ if ( "ApplicationScoped".equals( simpleName ) ) {
+ javaxPrefix = "javax.enterprise.context.";
+ jakartaPrefix = "jakarta.enterprise.context.";
+ }
+ if ( getTypeFactory().isTypeAvailable( javaxPrefix + simpleName ) ) {
+ return getTypeFactory().getType( javaxPrefix + simpleName );
+ }
+
+ if ( getTypeFactory().isTypeAvailable( jakartaPrefix + simpleName ) ) {
+ return getTypeFactory().getType( jakartaPrefix + simpleName );
+ }
+
+ throw new AnnotationProcessingException(
+ "Couldn't find any of the CDI or Jakarta CDI Dependency types." +
+ " Are you missing a dependency on your classpath?" );
+ }
}
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/processor/JakartaCdiComponentProcessor.java b/processor/src/main/java/org/mapstruct/ap/internal/processor/JakartaCdiComponentProcessor.java
new file mode 100644
index 000000000..11c765668
--- /dev/null
+++ b/processor/src/main/java/org/mapstruct/ap/internal/processor/JakartaCdiComponentProcessor.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.internal.processor;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.mapstruct.ap.internal.gem.MappingConstantsGem;
+import org.mapstruct.ap.internal.model.Annotation;
+import org.mapstruct.ap.internal.model.Mapper;
+
+/**
+ * A {@link ModelElementProcessor} which converts the given {@link Mapper}
+ * object into an application-scoped Jakarta CDI bean in case Jakarta CDI
+ * is configured as the target component model for this mapper.
+ *
+ * @author Filip Hrisafov
+ */
+public class JakartaCdiComponentProcessor extends AnnotationBasedComponentModelProcessor {
+
+ @Override
+ protected String getComponentModelIdentifier() {
+ return MappingConstantsGem.ComponentModelGem.JAKARTA_CDI;
+ }
+
+ @Override
+ protected List getTypeAnnotations(Mapper mapper) {
+ return Collections.singletonList(
+ new Annotation( getTypeFactory().getType( "jakarta.enterprise.context.ApplicationScoped" ) )
+ );
+ }
+
+ @Override
+ protected List getMapperReferenceAnnotations() {
+ return Arrays.asList( new Annotation( getTypeFactory().getType( "jakarta.inject.Inject" ) ) );
+ }
+
+ @Override
+ protected boolean requiresGenerationOfDecoratorClass() {
+ return false;
+ }
+
+ @Override
+ protected boolean additionalPublicEmptyConstructor() {
+ return true;
+ }
+
+}
diff --git a/processor/src/main/resources/META-INF/services/org.mapstruct.ap.internal.processor.ModelElementProcessor b/processor/src/main/resources/META-INF/services/org.mapstruct.ap.internal.processor.ModelElementProcessor
index cab1d83ed..d5234fca5 100644
--- a/processor/src/main/resources/META-INF/services/org.mapstruct.ap.internal.processor.ModelElementProcessor
+++ b/processor/src/main/resources/META-INF/services/org.mapstruct.ap.internal.processor.ModelElementProcessor
@@ -3,6 +3,7 @@
# Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
org.mapstruct.ap.internal.processor.CdiComponentProcessor
+org.mapstruct.ap.internal.processor.JakartaCdiComponentProcessor
org.mapstruct.ap.internal.processor.Jsr330ComponentProcessor
org.mapstruct.ap.internal.processor.JakartaComponentProcessor
org.mapstruct.ap.internal.processor.MapperCreationProcessor
diff --git a/processor/src/test/java/org/mapstruct/ap/test/gem/ConstantTest.java b/processor/src/test/java/org/mapstruct/ap/test/gem/ConstantTest.java
index 548ee61f2..25489a5b6 100644
--- a/processor/src/test/java/org/mapstruct/ap/test/gem/ConstantTest.java
+++ b/processor/src/test/java/org/mapstruct/ap/test/gem/ConstantTest.java
@@ -34,7 +34,7 @@ public class ConstantTest {
}
@Test
- public void componentModelContantsShouldBeEqual() {
+ public void componentModelConstantsShouldBeEqual() {
assertThat( MappingConstants.ComponentModel.DEFAULT )
.isEqualTo( MappingConstantsGem.ComponentModelGem.DEFAULT );
assertThat( MappingConstants.ComponentModel.CDI ).isEqualTo( MappingConstantsGem.ComponentModelGem.CDI );
@@ -42,5 +42,7 @@ public class ConstantTest {
assertThat( MappingConstants.ComponentModel.JSR330 ).isEqualTo( MappingConstantsGem.ComponentModelGem.JSR330 );
assertThat( MappingConstants.ComponentModel.JAKARTA )
.isEqualTo( MappingConstantsGem.ComponentModelGem.JAKARTA );
+ assertThat( MappingConstants.ComponentModel.JAKARTA_CDI )
+ .isEqualTo( MappingConstantsGem.ComponentModelGem.JAKARTA_CDI );
}
}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/CdiDefaultCompileOptionFieldMapperTest.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/CdiDefaultCompileOptionFieldMapperTest.java
new file mode 100644
index 000000000..bf8b292ec
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/CdiDefaultCompileOptionFieldMapperTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.cdi._default;
+
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerDto;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerEntity;
+import org.mapstruct.ap.test.injectionstrategy.shared.Gender;
+import org.mapstruct.ap.test.injectionstrategy.shared.GenderDto;
+import org.mapstruct.ap.testutil.IssueKey;
+import org.mapstruct.ap.testutil.ProcessorTest;
+import org.mapstruct.ap.testutil.WithCdi;
+import org.mapstruct.ap.testutil.WithClasses;
+import org.mapstruct.ap.testutil.runner.GeneratedSource;
+
+import static java.lang.System.lineSeparator;
+
+/**
+ * Test field injection for component model jakarta-cdi.
+ * Default value option mapstruct.defaultInjectionStrategy is "field"
+ *
+ * @author Filip Hrisafov
+ */
+@IssueKey("2950")
+@WithClasses({
+ CustomerDto.class,
+ CustomerEntity.class,
+ Gender.class,
+ GenderDto.class,
+ CustomerCdiDefaultCompileOptionFieldMapper.class,
+ GenderCdiDefaultCompileOptionFieldMapper.class
+})
+@WithCdi
+public class CdiDefaultCompileOptionFieldMapperTest {
+
+ @RegisterExtension
+ final GeneratedSource generatedSource = new GeneratedSource();
+
+ @ProcessorTest
+ public void shouldHaveFieldInjection() {
+ generatedSource.forMapper( CustomerCdiDefaultCompileOptionFieldMapper.class )
+ .content()
+ .contains( "import javax.enterprise.context.ApplicationScoped;" )
+ .contains( "import javax.inject.Inject;" )
+ .contains( "@Inject" + lineSeparator() + " private GenderCdiDefaultCompileOptionFieldMapper" )
+ .contains( "@ApplicationScoped" + lineSeparator() + "public class" )
+ .doesNotContain( "public CustomerCdiDefaultCompileOptionFieldMapperImpl(" )
+ .doesNotContain( "jakarta.inject" )
+ .doesNotContain( "jakarta.enterprise" );
+ }
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/CustomerCdiDefaultCompileOptionFieldMapper.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/CustomerCdiDefaultCompileOptionFieldMapper.java
new file mode 100644
index 000000000..ed0ed0a76
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/CustomerCdiDefaultCompileOptionFieldMapper.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.cdi._default;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerDto;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerEntity;
+
+/**
+ * @author Filip Hrisafov
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.CDI,
+ uses = GenderCdiDefaultCompileOptionFieldMapper.class)
+public interface CustomerCdiDefaultCompileOptionFieldMapper {
+
+ CustomerDto asTarget(CustomerEntity customerEntity);
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/GenderCdiDefaultCompileOptionFieldMapper.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/GenderCdiDefaultCompileOptionFieldMapper.java
new file mode 100644
index 000000000..14d6a2e0d
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/_default/GenderCdiDefaultCompileOptionFieldMapper.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.cdi._default;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ValueMapping;
+import org.mapstruct.ValueMappings;
+import org.mapstruct.ap.test.injectionstrategy.shared.Gender;
+import org.mapstruct.ap.test.injectionstrategy.shared.GenderDto;
+
+/**
+ * @author Filip Hrisafov
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.CDI)
+public interface GenderCdiDefaultCompileOptionFieldMapper {
+
+ @ValueMappings({
+ @ValueMapping(source = "MALE", target = "M"),
+ @ValueMapping(source = "FEMALE", target = "F")
+ })
+ GenderDto mapToDto(Gender gender);
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/CustomerCdiDefaultCompileOptionFieldMapper.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/CustomerCdiDefaultCompileOptionFieldMapper.java
new file mode 100644
index 000000000..4c893b748
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/CustomerCdiDefaultCompileOptionFieldMapper.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.cdi.jakarta;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerDto;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerEntity;
+
+/**
+ * @author Filip Hrisafov
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.CDI,
+ uses = GenderCdiDefaultCompileOptionFieldMapper.class)
+public interface CustomerCdiDefaultCompileOptionFieldMapper {
+
+ CustomerDto asTarget(CustomerEntity customerEntity);
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/GenderCdiDefaultCompileOptionFieldMapper.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/GenderCdiDefaultCompileOptionFieldMapper.java
new file mode 100644
index 000000000..8664b0b43
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/GenderCdiDefaultCompileOptionFieldMapper.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.cdi.jakarta;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ValueMapping;
+import org.mapstruct.ValueMappings;
+import org.mapstruct.ap.test.injectionstrategy.shared.Gender;
+import org.mapstruct.ap.test.injectionstrategy.shared.GenderDto;
+
+/**
+ * @author Filip Hrisafov
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.CDI)
+public interface GenderCdiDefaultCompileOptionFieldMapper {
+
+ @ValueMappings({
+ @ValueMapping(source = "MALE", target = "M"),
+ @ValueMapping(source = "FEMALE", target = "F")
+ })
+ GenderDto mapToDto(Gender gender);
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/JakartaCdiAndCdiDefaultCompileOptionFieldMapperTest.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/JakartaCdiAndCdiDefaultCompileOptionFieldMapperTest.java
new file mode 100644
index 000000000..55480399a
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/JakartaCdiAndCdiDefaultCompileOptionFieldMapperTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.cdi.jakarta;
+
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerDto;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerEntity;
+import org.mapstruct.ap.test.injectionstrategy.shared.Gender;
+import org.mapstruct.ap.test.injectionstrategy.shared.GenderDto;
+import org.mapstruct.ap.testutil.IssueKey;
+import org.mapstruct.ap.testutil.ProcessorTest;
+import org.mapstruct.ap.testutil.WithCdi;
+import org.mapstruct.ap.testutil.WithClasses;
+import org.mapstruct.ap.testutil.WithJakartaCdi;
+import org.mapstruct.ap.testutil.runner.GeneratedSource;
+
+import static java.lang.System.lineSeparator;
+
+/**
+ * Test field injection for component model jsr330.
+ * Default value option mapstruct.defaultInjectionStrategy is "field"
+ *
+ * @author Filip Hrisafov
+ */
+@IssueKey("2950")
+@WithClasses({
+ CustomerDto.class,
+ CustomerEntity.class,
+ Gender.class,
+ GenderDto.class,
+ CustomerCdiDefaultCompileOptionFieldMapper.class,
+ GenderCdiDefaultCompileOptionFieldMapper.class
+})
+@WithJakartaCdi
+@WithCdi
+public class JakartaCdiAndCdiDefaultCompileOptionFieldMapperTest {
+
+ @RegisterExtension
+ final GeneratedSource generatedSource = new GeneratedSource();
+
+ @ProcessorTest
+ public void shouldHaveCdiInjection() {
+ generatedSource.forMapper( CustomerCdiDefaultCompileOptionFieldMapper.class )
+ .content()
+ .contains( "import javax.enterprise.context.ApplicationScoped;" )
+ .contains( "import javax.inject.Inject;" )
+ .contains( "@Inject" + lineSeparator() + " private GenderCdiDefaultCompileOptionFieldMapper" )
+ .contains( "@ApplicationScoped" + lineSeparator() + "public class" )
+ .doesNotContain( "public CustomerCdiDefaultCompileOptionFieldMapperImpl(" )
+ .doesNotContain( "jakarta.inject" )
+ .doesNotContain( "jakarta.enterprise" );
+ }
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/JakartaCdiCdiDefaultCompileOptionFieldMapperTest.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/JakartaCdiCdiDefaultCompileOptionFieldMapperTest.java
new file mode 100644
index 000000000..953747e40
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/cdi/jakarta/JakartaCdiCdiDefaultCompileOptionFieldMapperTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.cdi.jakarta;
+
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerDto;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerEntity;
+import org.mapstruct.ap.test.injectionstrategy.shared.Gender;
+import org.mapstruct.ap.test.injectionstrategy.shared.GenderDto;
+import org.mapstruct.ap.testutil.IssueKey;
+import org.mapstruct.ap.testutil.ProcessorTest;
+import org.mapstruct.ap.testutil.WithClasses;
+import org.mapstruct.ap.testutil.WithJakartaCdi;
+import org.mapstruct.ap.testutil.runner.GeneratedSource;
+
+import static java.lang.System.lineSeparator;
+
+/**
+ * Test field injection for component model jsr330.
+ * Default value option mapstruct.defaultInjectionStrategy is "field"
+ *
+ * @author Filip Hrisafov
+ */
+@IssueKey("2950")
+@WithClasses({
+ CustomerDto.class,
+ CustomerEntity.class,
+ Gender.class,
+ GenderDto.class,
+ CustomerCdiDefaultCompileOptionFieldMapper.class,
+ GenderCdiDefaultCompileOptionFieldMapper.class
+})
+@WithJakartaCdi
+public class JakartaCdiCdiDefaultCompileOptionFieldMapperTest {
+
+ @RegisterExtension
+ final GeneratedSource generatedSource = new GeneratedSource();
+
+ @ProcessorTest
+ public void shouldHaveJakartaCdiInjection() {
+ generatedSource.forMapper( CustomerCdiDefaultCompileOptionFieldMapper.class )
+ .content()
+ .contains( "import jakarta.enterprise.context.ApplicationScoped;" )
+ .contains( "import jakarta.inject.Inject;" )
+ .contains( "@Inject" + lineSeparator() + " private GenderCdiDefaultCompileOptionFieldMapper" )
+ .contains( "@ApplicationScoped" + lineSeparator() + "public class" )
+ .doesNotContain( "public CustomerCdiDefaultCompileOptionFieldMapperImpl(" )
+ .doesNotContain( "javax.inject" )
+ .doesNotContain( "javax.enterprise" );
+ }
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/CustomerJakartaCdiDefaultCompileOptionFieldMapper.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/CustomerJakartaCdiDefaultCompileOptionFieldMapper.java
new file mode 100644
index 000000000..9ec0709f5
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/CustomerJakartaCdiDefaultCompileOptionFieldMapper.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.jakarta_cdi._default;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerDto;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerEntity;
+
+/**
+ * @author Filip Hrisafov
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.JAKARTA_CDI,
+ uses = GenderJakartaCdiDefaultCompileOptionFieldMapper.class)
+public interface CustomerJakartaCdiDefaultCompileOptionFieldMapper {
+
+ CustomerDto asTarget(CustomerEntity customerEntity);
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/GenderJakartaCdiDefaultCompileOptionFieldMapper.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/GenderJakartaCdiDefaultCompileOptionFieldMapper.java
new file mode 100644
index 000000000..0c1aef6ec
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/GenderJakartaCdiDefaultCompileOptionFieldMapper.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.jakarta_cdi._default;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ValueMapping;
+import org.mapstruct.ValueMappings;
+import org.mapstruct.ap.test.injectionstrategy.shared.Gender;
+import org.mapstruct.ap.test.injectionstrategy.shared.GenderDto;
+
+/**
+ * @author Filip Hrisafov
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.JSR330)
+public interface GenderJakartaCdiDefaultCompileOptionFieldMapper {
+
+ @ValueMappings({
+ @ValueMapping(source = "MALE", target = "M"),
+ @ValueMapping(source = "FEMALE", target = "F")
+ })
+ GenderDto mapToDto(Gender gender);
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/JakartaCdiAndCdiDefaultCompileOptionFieldMapperTest.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/JakartaCdiAndCdiDefaultCompileOptionFieldMapperTest.java
new file mode 100644
index 000000000..b542c99c2
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/JakartaCdiAndCdiDefaultCompileOptionFieldMapperTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.jakarta_cdi._default;
+
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerDto;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerEntity;
+import org.mapstruct.ap.test.injectionstrategy.shared.Gender;
+import org.mapstruct.ap.test.injectionstrategy.shared.GenderDto;
+import org.mapstruct.ap.testutil.IssueKey;
+import org.mapstruct.ap.testutil.ProcessorTest;
+import org.mapstruct.ap.testutil.WithCdi;
+import org.mapstruct.ap.testutil.WithClasses;
+import org.mapstruct.ap.testutil.WithJakartaCdi;
+import org.mapstruct.ap.testutil.runner.GeneratedSource;
+
+import static java.lang.System.lineSeparator;
+
+/**
+ * Test field injection for component model jakarta.
+ * Default value option mapstruct.defaultInjectionStrategy is "field"
+ *
+ * @author Filip Hrisafov
+ */
+@IssueKey("2950")
+@WithClasses({
+ CustomerDto.class,
+ CustomerEntity.class,
+ Gender.class,
+ GenderDto.class,
+ CustomerJakartaCdiDefaultCompileOptionFieldMapper.class,
+ GenderJakartaCdiDefaultCompileOptionFieldMapper.class
+})
+@WithJakartaCdi
+@WithCdi
+public class JakartaCdiAndCdiDefaultCompileOptionFieldMapperTest {
+
+ @RegisterExtension
+ final GeneratedSource generatedSource = new GeneratedSource();
+
+ @ProcessorTest
+ public void shouldHaveJakartaInjection() {
+ generatedSource.forMapper( CustomerJakartaCdiDefaultCompileOptionFieldMapper.class )
+ .content()
+ .contains( "import jakarta.enterprise.context.ApplicationScoped;" )
+ .contains( "import jakarta.inject.Inject;" )
+ .contains( "@Inject" + lineSeparator() + " private GenderJakartaCdiDefaultCompileOptionFieldMapper" )
+ .contains( "@ApplicationScoped" + lineSeparator() + "public class" )
+ .doesNotContain( "javax.inject" )
+ .doesNotContain( "javax.enterprise" );
+ }
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/JakartaCdiDefaultCompileOptionFieldMapperTest.java b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/JakartaCdiDefaultCompileOptionFieldMapperTest.java
new file mode 100644
index 000000000..57714cdb0
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/injectionstrategy/jakarta_cdi/_default/JakartaCdiDefaultCompileOptionFieldMapperTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.test.injectionstrategy.jakarta_cdi._default;
+
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerDto;
+import org.mapstruct.ap.test.injectionstrategy.shared.CustomerEntity;
+import org.mapstruct.ap.test.injectionstrategy.shared.Gender;
+import org.mapstruct.ap.test.injectionstrategy.shared.GenderDto;
+import org.mapstruct.ap.testutil.IssueKey;
+import org.mapstruct.ap.testutil.ProcessorTest;
+import org.mapstruct.ap.testutil.WithClasses;
+import org.mapstruct.ap.testutil.WithJakartaCdi;
+import org.mapstruct.ap.testutil.runner.GeneratedSource;
+
+import static java.lang.System.lineSeparator;
+
+/**
+ * Test field injection for component model jakarta-cdi.
+ * Default value option mapstruct.defaultInjectionStrategy is "field"
+ *
+ * @author Filip Hrisafov
+ */
+@IssueKey("2950")
+@WithClasses({
+ CustomerDto.class,
+ CustomerEntity.class,
+ Gender.class,
+ GenderDto.class,
+ CustomerJakartaCdiDefaultCompileOptionFieldMapper.class,
+ GenderJakartaCdiDefaultCompileOptionFieldMapper.class
+})
+@WithJakartaCdi
+public class JakartaCdiDefaultCompileOptionFieldMapperTest {
+
+ @RegisterExtension
+ final GeneratedSource generatedSource = new GeneratedSource();
+
+ @ProcessorTest
+ public void shouldHaveFieldInjection() {
+ generatedSource.forMapper( CustomerJakartaCdiDefaultCompileOptionFieldMapper.class )
+ .content()
+ .contains( "import jakarta.enterprise.context.ApplicationScoped;" )
+ .contains( "import jakarta.inject.Inject;" )
+ .contains( "@Inject" + lineSeparator() + " private GenderJakartaCdiDefaultCompileOptionFieldMapper" )
+ .contains( "@ApplicationScoped" + lineSeparator() + "public class" )
+ .doesNotContain( "public CustomerJakartaCdiDefaultCompileOptionFieldMapperImpl(" )
+ .doesNotContain( "javax.inject" )
+ .doesNotContain( "javax.enterprise" );
+ }
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/testutil/WithCdi.java b/processor/src/test/java/org/mapstruct/ap/testutil/WithCdi.java
new file mode 100644
index 000000000..6da78fbfe
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/testutil/WithCdi.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.testutil;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Meta annotation that adds the needed Spring Dependencies
+ *
+ * @author Filip Hrisafov
+ */
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@WithTestDependency({
+ "javax.inject",
+ "cdi-api",
+})
+public @interface WithCdi {
+
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/testutil/WithJakartaCdi.java b/processor/src/test/java/org/mapstruct/ap/testutil/WithJakartaCdi.java
new file mode 100644
index 000000000..f22a1d26e
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/testutil/WithJakartaCdi.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright MapStruct Authors.
+ *
+ * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.mapstruct.ap.testutil;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Meta annotation that adds the needed Spring Dependencies
+ *
+ * @author Filip Hrisafov
+ */
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@WithTestDependency({
+ "jakarta.inject-api",
+ "jakarta.enterprise.cdi-api",
+})
+public @interface WithJakartaCdi {
+
+}