Skip to content

Commit

Permalink
Avoid duplicated field serialization in reflection free Jackson seria…
Browse files Browse the repository at this point in the history
…lizers

(cherry picked from commit 9d54998)
  • Loading branch information
mariofusco authored and gsmet committed Nov 5, 2024
1 parent 4948e74 commit 0664edf
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -190,13 +190,13 @@ protected boolean createSerializationMethod(ClassInfo classInfo, ClassCreator cl

private boolean serializeObject(ClassInfo classInfo, ClassCreator classCreator, String beanClassName,
MethodCreator serialize) {
Set<String> serializedFields = new HashSet<>();
SerializationContext ctx = new SerializationContext(serialize, beanClassName);

// jsonGenerator.writeStartObject();
MethodDescriptor writeStartObject = MethodDescriptor.ofMethod(JSON_GEN_CLASS_NAME, "writeStartObject", "void");
serialize.invokeVirtualMethod(writeStartObject, ctx.jsonGenerator);

Set<String> serializedFields = new HashSet<>();
boolean valid = serializeObjectData(classInfo, classCreator, serialize, ctx, serializedFields);

// jsonGenerator.writeEndObject();
Expand All @@ -222,7 +222,7 @@ private boolean serializeFields(ClassInfo classInfo, ClassCreator classCreator,
SerializationContext ctx, Set<String> serializedFields) {
for (FieldInfo fieldInfo : classFields(classInfo)) {
FieldSpecs fieldSpecs = fieldSpecsFromField(classInfo, fieldInfo);
if (fieldSpecs != null && serializedFields.add(fieldSpecs.fieldName)) {
if (fieldSpecs != null && serializedFields.add(fieldSpecs.jsonName)) {
if (fieldSpecs.hasUnknownAnnotation()) {
return false;
}
Expand All @@ -236,7 +236,7 @@ private boolean serializeMethods(ClassInfo classInfo, ClassCreator classCreator,
SerializationContext ctx, Set<String> serializedFields) {
for (MethodInfo methodInfo : classMethods(classInfo)) {
FieldSpecs fieldSpecs = fieldSpecsFromMethod(methodInfo);
if (fieldSpecs != null && serializedFields.add(fieldSpecs.fieldName)) {
if (fieldSpecs != null && serializedFields.add(fieldSpecs.jsonName)) {
if (fieldSpecs.hasUnknownAnnotation()) {
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,13 @@ public Dog echoDog(Dog dog) {
return dog;
}

@POST
@Path("/record-echo")
@Consumes(MediaType.APPLICATION_JSON)
public StateRecord echoDog(StateRecord stateRecord) {
return stateRecord;
}

@EnableSecureSerialization
@GET
@Path("/abstract-cat")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.function.Supplier;

Expand Down Expand Up @@ -35,7 +36,7 @@ public JavaArchive get() {
AbstractPet.class, Dog.class, Cat.class, Veterinarian.class, AbstractNamedPet.class,
AbstractUnsecuredPet.class, UnsecuredPet.class, SecuredPersonInterface.class, Frog.class,
Pond.class, FrogBodyParts.class, FrogBodyParts.BodyPart.class, ContainerDTO.class,
NestedInterface.class)
NestedInterface.class, StateRecord.class)
.addAsResource(new StringAsset("admin-expression=admin\n" +
"user-expression=user\n" +
"birth-date-roles=alice,bob\n"), "application.properties");
Expand Down Expand Up @@ -709,4 +710,27 @@ public void testEchoWithMissingPrimitive() {
.body("veterinarian.name", Matchers.is("Dolittle"))
.body("veterinarian.title", Matchers.nullValue());
}

@Test
public void testRecordEcho() {
String response = RestAssured
.with()
.body("{\"code\":\"AL\",\"is_enabled\":true,\"name\":\"Alabama\"}")
.contentType("application/json; charset=utf-8")
.post("/simple/record-echo")
.then()
.statusCode(200)
.contentType("application/json")
.body("name", Matchers.is("Alabama"))
.body("code", Matchers.is("AL"))
.body("is_enabled", Matchers.is(true))
.extract()
.asString();

int first = response.indexOf("is_enabled");
int last = response.lastIndexOf("is_enabled");
// assert that the "is_enabled" field is present only once in the response
assertTrue(first >= 0);
assertEquals(first, last);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public JavaArchive get() {
AbstractPet.class, Dog.class, Cat.class, Veterinarian.class, AbstractNamedPet.class,
AbstractUnsecuredPet.class, UnsecuredPet.class, SecuredPersonInterface.class, Frog.class,
Pond.class, FrogBodyParts.class, FrogBodyParts.BodyPart.class, ContainerDTO.class,
NestedInterface.class)
NestedInterface.class, StateRecord.class)
.addAsResource(new StringAsset("admin-expression=admin\n" +
"user-expression=user\n" +
"birth-date-roles=alice,bob\n" +
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.quarkus.resteasy.reactive.jackson.deployment.test;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
public record StateRecord(String name, String code, @JsonProperty("is_enabled") boolean isEnabled) {
}

0 comments on commit 0664edf

Please sign in to comment.