Skip to content

Commit

Permalink
Record constructor with single write-only parameter should result in …
Browse files Browse the repository at this point in the history
…properties-based creator, to fix FasterXML#3897.
  • Loading branch information
yihtserns committed May 3, 2023
1 parent 8040e2a commit 8df3dfc
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1032,6 +1032,10 @@ private boolean _checkIfCreatorPropertyBased(BeanDescription beanDesc,
}
}
}
// [databind#3897]: Record canonical constructor will have implicitly named propDef
if (propDef != null && !propDef.isExplicitlyNamed() && beanDesc.isRecordType()) {
return true;
}
// in absence of everything else, default to delegating
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,20 @@ record SnakeRecord(String myId, String myValue){}

record RecordWithJsonDeserialize(int id, @JsonDeserialize(converter = StringTrimmer.class) String name) { }

record RecordSingleWriteOnly(@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) int id) { }

record RecordSomeWriteOnly(
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) int id,
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) String name,
String email) {
}

record RecordAllWriteOnly(
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) int id,
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) String name,
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) String email) {
}

private final ObjectMapper MAPPER = newJsonMapper();

/*
Expand Down Expand Up @@ -204,6 +218,53 @@ public void testDeserializeJsonDeserializeRecord() throws Exception {
assertEquals(new RecordWithJsonDeserialize(123, "Bob"), value);
}

/*
/**********************************************************************
/* Test methods, JsonProperty(access=WRITE_ONLY)
/**********************************************************************
*/

public void testSerialize_SingleWriteOnlyParameter() throws Exception {
String json = MAPPER.writeValueAsString(new RecordSingleWriteOnly(123));

assertEquals("{}", json);
}

// [databind#3897]
public void testDeserialize_SingleWriteOnlyParameter() throws Exception {
RecordSingleWriteOnly value = MAPPER.readValue("{\"id\":123}", RecordSingleWriteOnly.class);

assertEquals(new RecordSingleWriteOnly(123), value);
}

public void testSerialize_SomeWriteOnlyParameter() throws Exception {
String json = MAPPER.writeValueAsString(new RecordSomeWriteOnly(123, "Bob", "[email protected]"));

assertEquals("{\"email\":\"[email protected]\"}", json);
}

public void testDeserialize_SomeWriteOnlyParameter() throws Exception {
RecordSomeWriteOnly value = MAPPER.readValue(
"{\"id\":123,\"name\":\"Bob\",\"email\":\"[email protected]\"}",
RecordSomeWriteOnly.class);

assertEquals(new RecordSomeWriteOnly(123, "Bob", "[email protected]"), value);
}

public void testSerialize_AllWriteOnlyParameter() throws Exception {
String json = MAPPER.writeValueAsString(new RecordAllWriteOnly(123, "Bob", "[email protected]"));

assertEquals("{}", json);
}

public void testDeserialize_AllWriteOnlyParameter() throws Exception {
RecordAllWriteOnly value = MAPPER.readValue(
"{\"id\":123,\"name\":\"Bob\",\"email\":\"[email protected]\"}",
RecordAllWriteOnly.class);

assertEquals(new RecordAllWriteOnly(123, "Bob", "[email protected]"), value);
}

/*
/**********************************************************************
/* Internal helper methods
Expand Down

0 comments on commit 8df3dfc

Please sign in to comment.