diff --git a/processor/pom.xml b/processor/pom.xml
index 2341c4ddb..87c351701 100644
--- a/processor/pom.xml
+++ b/processor/pom.xml
@@ -286,6 +286,7 @@
org.apache.maven.plugins
maven-compiler-plugin
+ ${minimum.java.version}
org.mapstruct.tools.gem
diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/common/Type.java b/processor/src/main/java/org/mapstruct/ap/internal/model/common/Type.java
index d0f65ce97..24f23ecea 100644
--- a/processor/src/main/java/org/mapstruct/ap/internal/model/common/Type.java
+++ b/processor/src/main/java/org/mapstruct/ap/internal/model/common/Type.java
@@ -796,6 +796,10 @@ public class Type extends ModelElement implements Comparable {
* @return an unmodifiable map of all write accessors indexed by property name
*/
public Map getPropertyWriteAccessors( CollectionMappingStrategyGem cmStrategy ) {
+ if ( isRecord() ) {
+ // Records do not have setters, so we return an empty map
+ return Collections.emptyMap();
+ }
// collect all candidate target accessors
List candidates = new ArrayList<>( getSetters() );
candidates.addAll( getAlternativeTargetAccessors() );
diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_3886/jdk21/Issue3886Mapper.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3886/jdk21/Issue3886Mapper.java
new file mode 100644
index 000000000..aba305a0b
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3886/jdk21/Issue3886Mapper.java
@@ -0,0 +1,31 @@
+/*
+ * 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.bugs._3886.jdk21;
+
+import java.time.LocalDate;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * @author Filip Hrisafov
+ */
+@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR)
+public interface Issue3886Mapper {
+
+ RangeRecord map(LocalDate validFrom);
+
+ record RangeRecord(LocalDate validFrom) {
+
+ public RangeRecord restrictTo(RangeRecord other) {
+ return null;
+ }
+
+ public void setName(String name) {
+ // This method is here to ensure that MapStruct won't treat it as a setter
+ }
+ }
+}
diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_3886/jdk21/Issue3886Test.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3886/jdk21/Issue3886Test.java
new file mode 100644
index 000000000..93c068cbc
--- /dev/null
+++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_3886/jdk21/Issue3886Test.java
@@ -0,0 +1,25 @@
+/*
+ * 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.bugs._3886.jdk21;
+
+import org.mapstruct.ap.testutil.IssueKey;
+import org.mapstruct.ap.testutil.ProcessorTest;
+import org.mapstruct.ap.testutil.WithClasses;
+import org.mapstruct.ap.testutil.runner.Compiler;
+
+/**
+ * @author Filip Hrisafov
+ */
+@WithClasses(Issue3886Mapper.class)
+@IssueKey("3886")
+class Issue3886Test {
+
+ // The current version of the Eclipse compiler we use does not support records
+ @ProcessorTest(Compiler.JDK)
+ void shouldCompile() {
+
+ }
+}