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
  • Loading branch information
mariofusco committed Nov 5, 2024
1 parent 2fe27df commit 9d54998
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 9d54998

Please sign in to comment.