Skip to content

Commit 0c6c856

Browse files
committed
Recognize null value in json payload using the reflection free serializer
1 parent c04eed2 commit 0c6c856

File tree

6 files changed

+33
-3
lines changed

6 files changed

+33
-3
lines changed

extensions/resteasy-reactive/rest-jackson/deployment/src/main/java/io/quarkus/resteasy/reactive/jackson/deployment/processor/JacksonDeserializerFactory.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,10 +475,16 @@ private static ResultHandle readValueForPrimitiveFields(BytecodeCreator bytecode
475475
AssignableResultHandle result = bytecode.createVariable(DescriptorUtils.typeToString(fieldType));
476476

477477
BranchResult isValueNull = bytecode.ifNull(valueNode);
478+
478479
BytecodeCreator isValueNullTrue = isValueNull.trueBranch();
479480
isValueNullTrue.assign(result, JacksonSerializationUtils.getDefaultValue(isValueNullTrue, fieldType));
480481

481-
BytecodeCreator isValueNullFalse = isValueNull.falseBranch();
482+
BranchResult isNullNode = isValueNull.falseBranch()
483+
.ifTrue(isValueNull.falseBranch().invokeVirtualMethod(ofMethod(JsonNode.class, "isNull", boolean.class),
484+
valueNode));
485+
isNullNode.trueBranch().assign(result, JacksonSerializationUtils.getDefaultValue(isNullNode.trueBranch(), fieldType));
486+
487+
BytecodeCreator isValueNullFalse = isNullNode.falseBranch();
482488

483489
ResultHandle convertedValue = switch (fieldType.name().toString()) {
484490
case "java.lang.String" -> isValueNullFalse.invokeVirtualMethod(ofMethod(JsonNode.class, "asText", String.class),

extensions/resteasy-reactive/rest-jackson/deployment/src/test/java/io/quarkus/resteasy/reactive/jackson/deployment/test/AbstractSimpleJsonTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,18 @@ public void testNullMapEcho() {
772772
.body("properties", Matchers.nullValue());
773773
}
774774

775+
@Test
776+
public void testNullStringEcho() {
777+
RestAssured
778+
.with()
779+
.body("{\"text\": null}")
780+
.contentType("application/json; charset=utf-8")
781+
.post("/simple/null-string-echo")
782+
.then()
783+
.statusCode(400)
784+
.body(containsString("must not be null"));
785+
}
786+
775787
@Test
776788
public void testItem() {
777789
RestAssured

extensions/resteasy-reactive/rest-jackson/deployment/src/test/java/io/quarkus/resteasy/reactive/jackson/deployment/test/SimpleJsonResource.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ public MapWrapper echoNullMap(MapWrapper mapWrapper) {
152152
return mapWrapper;
153153
}
154154

155+
@POST
156+
@Path("/null-string-echo")
157+
public String echoNullString(@Valid StringWrapper input) {
158+
return input.text();
159+
}
160+
155161
@GET
156162
@Path("/abstract-cat")
157163
public AbstractPet getAbstractCat() {

extensions/resteasy-reactive/rest-jackson/deployment/src/test/java/io/quarkus/resteasy/reactive/jackson/deployment/test/SimpleJsonTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public JavaArchive get() {
2929
Fruit.class, Price.class, DogRecord.class, ItemExtended.class, Book.class, LombokBook.class,
3030
PrimitiveTypesBean.class, PrimitiveTypesRecord.class, TokenResponse.class,
3131
ItemJsonValuePublicMethod.class, ItemJsonValuePublicField.class,
32-
ItemJsonValuePrivateMethod.class, ItemJsonValuePrivateField.class)
32+
ItemJsonValuePrivateMethod.class, ItemJsonValuePrivateField.class, StringWrapper.class)
3333
.addAsResource(new StringAsset("admin-expression=admin\n" +
3434
"user-expression=user\n" +
3535
"birth-date-roles=alice,bob\n"), "application.properties");

extensions/resteasy-reactive/rest-jackson/deployment/src/test/java/io/quarkus/resteasy/reactive/jackson/deployment/test/SimpleJsonWithReflectionFreeSerializersTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public JavaArchive get() {
3131
Fruit.class, Price.class, DogRecord.class, ItemExtended.class, Book.class, LombokBook.class,
3232
PrimitiveTypesBean.class, PrimitiveTypesRecord.class, TokenResponse.class,
3333
ItemJsonValuePublicMethod.class, ItemJsonValuePublicField.class,
34-
ItemJsonValuePrivateMethod.class, ItemJsonValuePrivateField.class)
34+
ItemJsonValuePrivateMethod.class, ItemJsonValuePrivateField.class, StringWrapper.class)
3535
.addAsResource(new StringAsset("admin-expression=admin\n" +
3636
"user-expression=user\n" +
3737
"birth-date-roles=alice,bob\n" +
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package io.quarkus.resteasy.reactive.jackson.deployment.test;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
public record StringWrapper(@NotNull String text) {
6+
}

0 commit comments

Comments
 (0)