Skip to content

Commit cd48166

Browse files
committed
support json property methods
1 parent ffbb2ba commit cd48166

File tree

4 files changed

+42
-13
lines changed

4 files changed

+42
-13
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.avaje.jsonb.generator;
22

33
import javax.lang.model.element.Element;
4+
import javax.lang.model.element.ExecutableElement;
45
import javax.lang.model.element.Modifier;
56
import java.util.*;
67

@@ -24,18 +25,23 @@ final class FieldReader {
2425
addSubType(subType);
2526
final PropertyIgnoreReader ignoreReader = new PropertyIgnoreReader(element);
2627
this.unmapped = ignoreReader.unmapped();
28+
var isMethod = element instanceof ExecutableElement;
2729
this.raw = ignoreReader.raw();
2830
this.serialize = ignoreReader.serialize();
29-
this.deserialize = ignoreReader.deserialize();
31+
this.deserialize = !isMethod && ignoreReader.deserialize();
3032

3133
final var fieldName = element.getSimpleName().toString();
32-
final var publicField = element.getModifiers().contains(Modifier.PUBLIC);
33-
this.property = new FieldProperty(element.asType(), raw, unmapped, genericTypeParams, publicField, fieldName);
34+
final var publicField = !isMethod && element.getModifiers().contains(Modifier.PUBLIC);
35+
36+
var type = isMethod ? ((ExecutableElement) element).getReturnType() : element.asType();
37+
38+
this.property =
39+
new FieldProperty(type, raw, unmapped, genericTypeParams, publicField, fieldName);
3440
this.propertyName =
35-
PropertyPrism.getOptionalOn(element)
36-
.map(PropertyPrism::value)
37-
.map(Util::escapeQuotes)
38-
.orElse(namingConvention.from(fieldName));
41+
PropertyPrism.getOptionalOn(element)
42+
.map(PropertyPrism::value)
43+
.map(Util::escapeQuotes)
44+
.orElse(namingConvention.from(fieldName));
3945

4046
this.aliases = initAliases(element);
4147
}

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void read(TypeElement type) {
9494
readField(element, localFields);
9595
break;
9696
case METHOD:
97-
readMethod(element, type);
97+
readMethod(element, type, localFields);
9898
break;
9999
}
100100
}
@@ -169,7 +169,7 @@ private void readConstructor(Element element, TypeElement type) {
169169
}
170170
}
171171

172-
private void readMethod(Element element, TypeElement type) {
172+
private void readMethod(Element element, TypeElement type, List<FieldReader> localFields) {
173173
ExecutableElement methodElement = (ExecutableElement) element;
174174
if (checkMethod2(methodElement)) {
175175
List<? extends VariableElement> parameters = methodElement.getParameters();
@@ -186,6 +186,24 @@ private void readMethod(Element element, TypeElement type) {
186186
}
187187
}
188188
}
189+
// for reading methods
190+
PropertyPrism.getOptionalOn(methodElement)
191+
.ifPresent(
192+
p -> {
193+
if (!methodElement.getParameters().isEmpty()) {
194+
logError("Json.Property can only be placed on Getter Methods", methodElement);
195+
return;
196+
}
197+
198+
final var frequency =
199+
frequencyMap.compute(p.value(), (k, v) -> v == null ? 0 : v + 1);
200+
201+
final var reader =
202+
new FieldReader(
203+
element, namingConvention, currentSubType, genericTypeParams, frequency);
204+
localFields.add(reader);
205+
reader.getterMethod(new MethodReader(methodElement, type));
206+
});
189207
}
190208

191209
private boolean checkMethod2(ExecutableElement methodElement) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ public class TestClass {
2525

2626
private Optional<String> op;
2727

28+
@Json.Property("what_a_save!")
29+
public String what_a_save() {
30+
return "Chat Disabled";
31+
}
32+
2833
public String getAlias() {
2934
return alias;
3035
}

jsonb/src/main/java/io/avaje/jsonb/Json.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110
* }</pre>
111111
*/
112112
@Retention(CLASS)
113-
@Target(FIELD)
113+
@Target({FIELD, METHOD})
114114
@interface Property {
115115

116116
/**
@@ -138,7 +138,7 @@
138138
}
139139

140140
/**
141-
* Deprecate - migrate to {@link Json.Alias}.
141+
* Deprecated - migrate to {@link Json.Alias}.
142142
*/
143143
@Deprecated
144144
@Retention(CLASS)
@@ -188,7 +188,7 @@
188188
* }</pre>
189189
*/
190190
@Retention(CLASS)
191-
@Target(FIELD)
191+
@Target({FIELD, METHOD})
192192
@interface Unmapped {
193193

194194
}
@@ -278,7 +278,7 @@
278278
* Marks a String field as containing raw JSON content.
279279
*/
280280
@Retention(CLASS)
281-
@Target(FIELD)
281+
@Target({FIELD, METHOD})
282282
@interface Raw {
283283

284284
}

0 commit comments

Comments
 (0)