diff --git a/src/main/java/com/fasterxml/jackson/databind/MapperFeature.java b/src/main/java/com/fasterxml/jackson/databind/MapperFeature.java
index 1549511b77..ef66ab98d4 100644
--- a/src/main/java/com/fasterxml/jackson/databind/MapperFeature.java
+++ b/src/main/java/com/fasterxml/jackson/databind/MapperFeature.java
@@ -1,5 +1,6 @@
package com.fasterxml.jackson.databind;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.cfg.ConfigFeature;
@@ -280,6 +281,14 @@ public enum MapperFeature implements ConfigFeature
*/
OVERRIDE_PUBLIC_ACCESS_MODIFIERS(true),
+ /**
+ * Feature that inverse logic in {@link JsonProperty#access}
+ * for READ_ONLY and WRITE_ONLY.
+ *
+ * Feature is disabled by default. + */ + INVERSE_READ_WRITE_ACCESS(false), + /* /****************************************************** /* Type-handling features diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java index 5cf537169d..fe2d332c7e 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java @@ -946,6 +946,20 @@ public JsonProperty.Access removeNonVisible(boolean inferMutators, if (acc == null) { acc = JsonProperty.Access.AUTO; } + + // [databind#2951] add feature to inverse access logic + if (_config.isEnabled(MapperFeature.INVERSE_READ_WRITE_ACCESS)) { + switch (acc) { + case READ_ONLY: + acc = JsonProperty.Access.WRITE_ONLY; + break; + case WRITE_ONLY: + acc = JsonProperty.Access.READ_ONLY; + break; + default: + } + } + switch (acc) { case READ_ONLY: // [databind#2719]: Need to add ignorals, first, keeping in mind diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/filter/ReadOrWriteOnlyTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/filter/ReadOrWriteOnlyTest.java index e49191487a..dbf9beb8cd 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/filter/ReadOrWriteOnlyTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/filter/ReadOrWriteOnlyTest.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.json.JsonMapper; import static org.junit.jupiter.api.Assertions.*; @@ -35,6 +36,15 @@ public int getY() { } } + // for [databind#2951], add feature to inverse access logic + static class ReadAWriteB { + @JsonProperty(access=JsonProperty.Access.READ_ONLY) + public int a = 1; + + @JsonProperty(access=JsonProperty.Access.WRITE_ONLY) + public int b = 2; + } + public static class Pojo935 { private String firstName = "Foo"; @@ -151,6 +161,22 @@ public void testReadOnlyAndWriteOnly() throws Exception assertEquals(6, result.y); } + // [databind#2951] add feature to inverse access logic + @Test + public void testInverseReadOnlyAndWriteOnly() throws Exception { + ObjectMapper mapper = JsonMapper.builder() + .enable(MapperFeature.INVERSE_READ_WRITE_ACCESS) + .build(); + + String json = mapper.writeValueAsString(new ReadAWriteB()); + assertEquals("{\"b\":2}", json); + + ReadAWriteB result = mapper.readValue("{\"a\":5, \"b\":6}", ReadAWriteB.class); + assertNotNull(result); + assertEquals(5, result.a); + assertEquals(2, result.b); + } + @Test public void testReadOnly935() throws Exception {