Skip to content

Commit e945332

Browse files
authored
Fix Creator Generation Error (#261)
* fix creator generation error
1 parent dd03ca4 commit e945332

File tree

4 files changed

+45
-38
lines changed

4 files changed

+45
-38
lines changed

jsonb-generator/src/main/java/io/avaje/jsonb/generator/ClassReader.java

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ final class ClassReader implements BeanReader {
7070
subTypes.stream().map(TypeSubTypeMeta::type).forEach(importTypes::add);
7171

7272
final var userTypeField = allFields.stream().filter(f -> f.propertyName().equals(typePropertyKey())).findAny();
73-
7473
this.usesTypeProperty = userTypeField.isPresent();
7574
this.useEnum =
7675
userTypeField
@@ -222,7 +221,6 @@ public void cascadeTypes(Set<String> types) {
222221
@Override
223222
public void writeFields(Append writer) {
224223
writer.append(" // naming convention %s", namingConvention).eol();
225-
226224
for (final FieldReader allField : allFields) {
227225
allField.writeDebug(writer);
228226
}
@@ -264,9 +262,9 @@ public void writeConstructor(Append writer) {
264262
if (allField.include() && !allField.isRaw() && uniqueTypes.add(allField.adapterShortType())) {
265263
if (hasSubTypes) {
266264
final var isCommonDiffType =
267-
allFields.stream()
268-
.filter(s -> s.fieldName().equals(allField.fieldName()))
269-
.anyMatch(f -> !allField.adapterShortType().equals(f.adapterShortType()));
265+
allFields.stream()
266+
.filter(s -> s.fieldName().equals(allField.fieldName()))
267+
.anyMatch(f -> !allField.adapterShortType().equals(f.adapterShortType()));
270268
isCommonFieldMap.put(allField.fieldName(), isCommonDiffType);
271269
}
272270
allField.writeConstructor(writer);
@@ -472,23 +470,32 @@ private void writeFromJsonImplementation(Append writer, String varName) {
472470

473471
private void writeJsonBuildResult(Append writer, String varName) {
474472
writer.append(" // build and return %s", shortName).eol();
475-
if (constructor == null) {
476-
writer.append(" %s _$%s = new %s(", shortName, varName, shortName);
477-
} else {
478-
writer.append(" %s _$%s = " + constructor.creationString(), shortName, varName);
479-
final List<MethodReader.MethodParam> params = constructor.getParams();
480-
for (int i = 0, size = params.size(); i < size; i++) {
481-
if (i > 0) {
482-
writer.append(", ");
483-
}
484-
final var name = params.get(i).name();
485-
// append increasing numbers to constructor params sharing names with other subtypes
486-
final var frequency = frequencyMap.compute(name, (k, v) -> v == null ? 0 : v + 1);
487-
// assuming name matches field here?
488-
writer.append(constructorParamName(name + (frequency == 0 ? "" : frequency.toString())));
473+
if (constructor == null) {
474+
writer.append(" %s _$%s = new %s(", shortName, varName, shortName);
475+
} else {
476+
writer.append(" %s _$%s = " + constructor.creationString(), shortName, varName);
477+
final List<MethodReader.MethodParam> params = constructor.getParams();
478+
for (int i = 0, size = params.size(); i < size; i++) {
479+
if (i > 0) {
480+
writer.append(", ");
489481
}
482+
483+
final var paramName = params.get(i).name();
484+
var name =
485+
allFields.stream()
486+
.filter(FieldReader::isConstructorParam)
487+
.filter(f -> f.propertyName().equals(paramName) || f.fieldName().equals(paramName))
488+
.map(FieldReader::fieldName)
489+
.findFirst()
490+
.orElse(paramName);
491+
492+
// append increasing numbers to constructor params sharing names with other subtypes
493+
final var frequency = frequencyMap.compute(name, (k, v) -> v == null ? 0 : v + 1);
494+
// assuming name matches field here?
495+
writer.append(constructorParamName(name + (frequency == 0 ? "" : frequency.toString())));
490496
}
491-
writer.append(");").eol();
497+
}
498+
writer.append(");").eol();
492499
for (final FieldReader allField : allFields) {
493500
if (allField.includeFromJson()) {
494501
frequencyMap.compute(allField.fieldName(), (k, v) -> v == null ? 0 : v + 1);
@@ -574,23 +581,23 @@ private void writeFromJsonSwitch(Append writer, boolean defaultConstructor, Stri
574581
final var isCommonFieldDiffType = isCommonFieldMap.get(name);
575582
if (isCommonFieldDiffType == null || !isCommonFieldDiffType) {
576583
allField.writeFromJsonSwitch(
577-
writer,
578-
defaultConstructor,
579-
varName,
580-
caseInsensitiveKeys,
581-
allFields.stream()
582-
.filter(x -> x.fieldName().equals(name))
583-
.flatMap(f -> f.aliases().stream())
584-
.collect(toList()));
584+
writer,
585+
defaultConstructor,
586+
varName,
587+
caseInsensitiveKeys,
588+
allFields.stream()
589+
.filter(x -> x.fieldName().equals(name))
590+
.flatMap(f -> f.aliases().stream())
591+
.collect(toList()));
585592
} else {
586593
// if subclass shares a field name with another subclass
587594
// write a special case statement
588595
writeSubTypeCase(
589-
name,
590-
writer,
591-
allFields.stream().filter(x -> x.fieldName().equals(name)).collect(toList()),
592-
defaultConstructor,
593-
varName);
596+
name,
597+
writer,
598+
allFields.stream().filter(x -> x.fieldName().equals(name)).collect(toList()),
599+
defaultConstructor,
600+
varName);
594601
}
595602

596603
} else
@@ -613,8 +620,7 @@ private void writeFromJsonSwitch(Append writer, boolean defaultConstructor, Stri
613620
private void writeSubTypeCase(String name, Append writer, List<FieldReader> commonFields, boolean defaultConstructor, String varName) {
614621
writer.append(" case \"%s\":", name).eol();
615622
// get all possible aliases of this field from the subtypes
616-
for (final String alias :
617-
commonFields.stream().map(FieldReader::aliases).findFirst().orElseGet(List::of)) {
623+
for (final String alias : commonFields.stream().map(FieldReader::aliases).findFirst().orElseGet(List::of)) {
618624
final String propertyKey = caseInsensitiveKeys ? alias.toLowerCase() : alias;
619625
writer.append(" case \"%s\":", propertyKey).eol();
620626
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldReader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ final class FieldReader {
6868
void readParam(VariableElement element) {
6969
this.deserialize = true;
7070
this.isCreatorParam = true;
71+
property.setConstructorParam();
7172
initAliases(element);
7273
}
7374

jsonb-generator/src/main/java/io/avaje/jsonb/generator/TypeReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ private boolean checkMethod2(ExecutableElement methodElement) {
293293

294294
private void matchFieldsToSetterOrConstructor() {
295295
for (FieldReader field : allFields) {
296-
if (field.includeFromJson()) {
296+
if (field.includeFromJson() && !field.isConstructorParam()) {
297297
if (constructorParamMap.get(field.fieldName()) != null) {
298298
field.setConstructorParam();
299299
} else {

jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/PropertyCreator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ public final class PropertyCreator {
3636

3737
@Json.Creator
3838
public PropertyCreator(
39-
String identifier,
39+
String uid,
4040
Instant startup,
4141
Properties configuration,
4242
Set<PropertyCreator> instances) {
4343
this.arguments = null;
4444
this.hooks = null;
4545

46-
this.identifier = identifier;
46+
this.identifier = uid;
4747
this.startup = startup;
4848
this.configuration = configuration;
4949
this.instances = null;

0 commit comments

Comments
 (0)