2525import io .swagger .v3 .oas .models .media .Schema ;
2626import io .swagger .v3 .oas .models .servers .Server ;
2727import io .swagger .v3 .oas .models .tags .Tag ;
28+ import lombok .Data ;
2829import lombok .Getter ;
30+ import lombok .RequiredArgsConstructor ;
2931import lombok .Setter ;
3032import org .apache .commons .lang3 .StringUtils ;
3133import org .apache .commons .lang3 .tuple .Pair ;
@@ -1147,6 +1149,29 @@ private Set<String> reformatProvideArgsParams(Operation operation) {
11471149 return provideArgsClassSet ;
11481150 }
11491151
1152+ @ Data
1153+ @ RequiredArgsConstructor
1154+ static class ConstructorSpecs {
1155+
1156+ static final String JSON_CREATOR = "@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)" ;
1157+ private final String constructorAnnotation ;
1158+ private final boolean useJsonProperty ;
1159+
1160+ static ConstructorSpecs useJsonProperty (boolean useJsonProperty ) {
1161+ return new ConstructorSpecs (useJsonProperty ?JSON_CREATOR : null , useJsonProperty );
1162+ }
1163+ }
1164+
1165+ /**
1166+ * Is JSpecify used?
1167+ *
1168+ * TODO: make it configurable
1169+ */
1170+ private boolean isUseJspecify () {
1171+ return importMapping .getOrDefault ("Nullable" , "" )
1172+ .contains ("jspecify" );
1173+ }
1174+
11501175 @ Override
11511176 public Map <String , ModelsMap > postProcessAllModels (Map <String , ModelsMap > objs ) {
11521177 objs = super .postProcessAllModels (objs );
@@ -1156,26 +1181,35 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
11561181 for (CodegenModel cm : allModels .values ()) {
11571182 boolean hasLombokNoArgsConstructor = lombokAnnotations != null && lombokAnnotations .containsKey ("NoArgsConstructor" );
11581183 boolean hasAllArgsConstructor = cm .vendorExtensions .containsKey ("x-java-all-args-constructor" );
1184+
11591185 if (!hasLombokNoArgsConstructor
11601186 && (cm .hasRequired || hasAllArgsConstructor )) {
1161- cm .vendorExtensions .put ("x-java-no-args-constructor" , true );
1162- }
11631187
1188+ String annotation = (cm .hasRequired && isUseJspecify ())? "@org.jspecify.annotations.NullUnmarked" : null ;
11641189
1190+ ConstructorSpecs noArgSpec = new ConstructorSpecs (annotation , false );
1191+ cm .vendorExtensions .put ("x-java-no-args-constructor" , noArgSpec );
1192+ }
1193+
1194+ boolean requiredJsonProperty = false ;
11651195 // add @JsonCreator on constructor
11661196 if (!this .withXml && jackson ) {
11671197 if (hasAllArgsConstructor ) {
11681198 // add @JsonCreator and @JsonProperty on the all argument constructor
1169- cm .vendorExtensions .put ("java-all-args-constructor-jsoncreator " , true );
1170- List <CodegenProperty > properties = (List <CodegenProperty >)cm .vendorExtensions .get ("x-java-all-args-constructor-vars" );
1171- properties .forEach (p -> p .vendorExtensions .put ("x-java-all-args-jsonProperty" , p .baseName ));
1199+ cm .vendorExtensions .put ("x- java-all-args-constructor" , ConstructorSpecs . useJsonProperty ( true ) );
1200+ // List<CodegenProperty> properties = (List<CodegenProperty>)cm.vendorExtensions.get("x-java-all-args-constructor-vars");
1201+ // properties.forEach(p -> p.vendorExtensions.put("x-java-all-args-jsonProperty", p.baseName));
11721202 } else if (this .generatedConstructorWithRequiredArgs && cm .hasRequired && cm .requiredVars .size () == cm .allVars .size ()) {
11731203 /* add @JsonCreator and @JsonProperty on the required argument constructor
11741204 * all fields are initialzed in the required constructor
11751205 * no all arg constructor
11761206 */
1177- cm .vendorExtensions .put ("x-java-required-constructor-jsoncreator" , true );
1178- cm .requiredVars .forEach (p -> p .vendorExtensions .put ("x-java-required-args-jsonProperty" , p .baseName ));
1207+ requiredJsonProperty = true ;
1208+ // cm.vendorExtensions.put("x-java-required-constructor-jsoncreator", true);
1209+ // cm.requiredVars.forEach(p -> p.vendorExtensions.put("x-java-required-args-jsonProperty", p.baseName));
1210+ }
1211+ if (generatedConstructorWithRequiredArgs && cm .hasRequired ) {
1212+ cm .vendorExtensions .put ("x-java-required-args-constructor" , ConstructorSpecs .useJsonProperty (requiredJsonProperty ));
11791213 }
11801214 }
11811215
0 commit comments