Skip to content

Commit 2424bcd

Browse files
Merge pull request #913 from mbramwell1/feature/improve-optionals-for-getters
Improve Optionals for Getters code to allow for specifying on a field level
2 parents 9de4ad5 + d6767c8 commit 2424bcd

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/PropertyRule.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public JDefinedClass apply(String nodeName, JsonNode node, JDefinedClass jclass,
7777
ruleFactory.getAnnotator().propertyField(field, jclass, nodeName, node);
7878

7979
if (isIncludeGetters) {
80-
JMethod getter = addGetter(jclass, field, nodeName, node, isRequired(nodeName, node, schema));
80+
JMethod getter = addGetter(jclass, field, nodeName, node, isRequired(nodeName, node, schema), useOptional(nodeName, node, schema));
8181
ruleFactory.getAnnotator().propertyGetter(getter, jclass, nodeName);
8282
propertyAnnotations(nodeName, node, schema, getter);
8383
}
@@ -129,6 +129,24 @@ private boolean isRequired(String nodeName, JsonNode node, Schema schema) {
129129
return false;
130130
}
131131

132+
private boolean useOptional(String nodeName, JsonNode node, Schema schema) {
133+
if (node.has("javaOptional")) {
134+
final JsonNode requiredNode = node.get("javaOptional");
135+
return requiredNode.asBoolean();
136+
}
137+
138+
JsonNode javaOptionalArray = schema.getContent().get("javaOptional");
139+
140+
if (javaOptionalArray != null) {
141+
for (JsonNode requiredNode : javaOptionalArray) {
142+
if (nodeName.equals(requiredNode.asText()))
143+
return true;
144+
}
145+
}
146+
147+
return false;
148+
}
149+
132150
private void propertyAnnotations(String nodeName, JsonNode node, Schema schema, JDocCommentable generatedJavaConstruct) {
133151
if (node.has("title")) {
134152
ruleFactory.getTitleRule().apply(nodeName, node.get("title"), generatedJavaConstruct, schema);
@@ -178,9 +196,9 @@ private boolean isArray(JsonNode node) {
178196
return node.path("type").asText().equals("array");
179197
}
180198

181-
private JType getReturnType(final JDefinedClass c, final JFieldVar field, final boolean required) {
199+
private JType getReturnType(final JDefinedClass c, final JFieldVar field, final boolean required, final boolean usesOptional) {
182200
JType returnType = field.type();
183-
if (ruleFactory.getGenerationConfig().isUseOptionalForGetters()) {
201+
if (ruleFactory.getGenerationConfig().isUseOptionalForGetters() || usesOptional) {
184202
if (!required && field.type().isReference()) {
185203
returnType = c.owner().ref("java.util.Optional").narrow(field.type());
186204
}
@@ -189,14 +207,14 @@ private JType getReturnType(final JDefinedClass c, final JFieldVar field, final
189207
return returnType;
190208
}
191209

192-
private JMethod addGetter(JDefinedClass c, JFieldVar field, String jsonPropertyName, JsonNode node, boolean isRequired) {
210+
private JMethod addGetter(JDefinedClass c, JFieldVar field, String jsonPropertyName, JsonNode node, boolean isRequired, boolean usesOptional) {
193211

194-
JType type = getReturnType(c, field, isRequired);
212+
JType type = getReturnType(c, field, isRequired, usesOptional);
195213

196214
JMethod getter = c.method(JMod.PUBLIC, type, getGetterName(jsonPropertyName, field.type(), node));
197215

198216
JBlock body = getter.body();
199-
if (ruleFactory.getGenerationConfig().isUseOptionalForGetters() && !isRequired
217+
if ((ruleFactory.getGenerationConfig().isUseOptionalForGetters() || usesOptional) && !isRequired
200218
&& field.type().isReference()) {
201219
body._return(c.owner().ref("java.util.Optional").staticInvoke("ofNullable").arg(field));
202220
} else {

0 commit comments

Comments
 (0)