Skip to content

Commit 5e46089

Browse files
committed
[java][webclient] Fix model combining properties and additional properties
1 parent 2b891f6 commit 5e46089

File tree

137 files changed

+1190
-36
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+1190
-36
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,14 @@ public void processOpts() {
585585
supportingFiles.add(new SupportingFile("auth/Authentication.mustache", authFolder, "Authentication.java"));
586586
} else if (WEBCLIENT.equals(getLibrary())) {
587587
forceSerializationLibrary(SERIALIZATION_LIBRARY_JACKSON);
588+
589+
// Composed schemas can have the 'additionalProperties' keyword, as specified in JSON schema.
590+
// In principle, this should be enabled by default for all code generators. However due to limitations
591+
// in other code generators, support needs to be enabled on a case-by-case basis.
592+
// The flag below should be set for all Java libraries, but the templates need to be ported
593+
// one by one for each library.
594+
supportsAdditionalPropertiesWithComposedSchema = true;
595+
588596
} else if (RESTCLIENT.equals(getLibrary())) {
589597
forceSerializationLibrary(SERIALIZATION_LIBRARY_JACKSON);
590598
applyJakartaPackage();
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{{#additionalPropertiesType}}
2+
/**
3+
* A container for additional, undeclared properties.
4+
* This is a holder for any undeclared properties as specified with
5+
* the 'additionalProperties' keyword in the OAS document.
6+
*/
7+
private Map<String, {{{.}}}> additionalProperties;
8+
9+
/**
10+
* Set the additional (undeclared) property with the specified name and value.
11+
* If the property does not already exist, create it otherwise replace it.
12+
* @param key the name of the property
13+
* @param value the value of the property
14+
* @return self reference
15+
*/
16+
@JsonAnySetter
17+
public {{classname}} putAdditionalProperty(String key, {{{.}}} value) {
18+
if (this.additionalProperties == null) {
19+
this.additionalProperties = new HashMap<String, {{{.}}}>();
20+
}
21+
this.additionalProperties.put(key, value);
22+
return this;
23+
}
24+
25+
/**
26+
* Return the additional (undeclared) properties.
27+
* @return the additional (undeclared) properties
28+
*/
29+
@JsonAnyGetter
30+
public Map<String, {{{.}}}> getAdditionalProperties() {
31+
return additionalProperties;
32+
}
33+
34+
/**
35+
* Return the additional (undeclared) property with the specified name.
36+
* @param key the name of the property
37+
* @return the additional (undeclared) property with the specified name
38+
*/
39+
public {{{.}}} getAdditionalProperty(String key) {
40+
if (this.additionalProperties == null) {
41+
return null;
42+
}
43+
return this.additionalProperties.get(key);
44+
}
45+
{{/additionalPropertiesType}}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
{{>licenseInfo}}
2+
3+
package {{package}};
4+
5+
{{#useReflectionEqualsHashCode}}
6+
import org.apache.commons.lang3.builder.EqualsBuilder;
7+
import org.apache.commons.lang3.builder.HashCodeBuilder;
8+
{{/useReflectionEqualsHashCode}}
9+
{{#models}}
10+
{{#model}}
11+
{{#additionalPropertiesType}}
12+
import java.util.Map;
13+
import java.util.HashMap;
14+
import com.fasterxml.jackson.annotation.JsonAnyGetter;
15+
import com.fasterxml.jackson.annotation.JsonAnySetter;
16+
{{/additionalPropertiesType}}
17+
{{/model}}
18+
{{/models}}
19+
import java.util.Objects;
20+
import java.util.Arrays;
21+
{{#imports}}
22+
import {{import}};
23+
{{/imports}}
24+
{{#serializableModel}}
25+
import java.io.Serializable;
26+
{{/serializableModel}}
27+
{{#jackson}}
28+
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
29+
import com.fasterxml.jackson.annotation.JsonTypeName;
30+
{{#withXml}}
31+
import com.fasterxml.jackson.dataformat.xml.annotation.*;
32+
{{/withXml}}
33+
{{#vendorExtensions.x-has-readonly-properties}}
34+
import com.fasterxml.jackson.annotation.JsonCreator;
35+
{{/vendorExtensions.x-has-readonly-properties}}
36+
{{/jackson}}
37+
{{#withXml}}
38+
import {{javaxPackage}}.xml.bind.annotation.*;
39+
import {{javaxPackage}}.xml.bind.annotation.adapters.*;
40+
import io.github.threetenjaxb.core.*;
41+
{{/withXml}}
42+
{{#jsonb}}
43+
import java.lang.reflect.Type;
44+
import {{javaxPackage}}.json.bind.annotation.JsonbTypeDeserializer;
45+
import {{javaxPackage}}.json.bind.annotation.JsonbTypeSerializer;
46+
import {{javaxPackage}}.json.bind.serializer.DeserializationContext;
47+
import {{javaxPackage}}.json.bind.serializer.JsonbDeserializer;
48+
import {{javaxPackage}}.json.bind.serializer.JsonbSerializer;
49+
import {{javaxPackage}}.json.bind.serializer.SerializationContext;
50+
import {{javaxPackage}}.json.stream.JsonGenerator;
51+
import {{javaxPackage}}.json.stream.JsonParser;
52+
import {{javaxPackage}}.json.bind.annotation.JsonbProperty;
53+
{{#vendorExtensions.x-has-readonly-properties}}
54+
import {{javaxPackage}}.json.bind.annotation.JsonbCreator;
55+
{{/vendorExtensions.x-has-readonly-properties}}
56+
{{/jsonb}}
57+
{{#parcelableModel}}
58+
import android.os.Parcelable;
59+
import android.os.Parcel;
60+
{{/parcelableModel}}
61+
{{#useBeanValidation}}
62+
import {{javaxPackage}}.validation.constraints.*;
63+
import {{javaxPackage}}.validation.Valid;
64+
{{/useBeanValidation}}
65+
{{#performBeanValidation}}
66+
import org.hibernate.validator.constraints.*;
67+
{{/performBeanValidation}}
68+
{{#supportUrlQuery}}
69+
import java.io.UnsupportedEncodingException;
70+
import java.net.URLEncoder;
71+
import java.util.StringJoiner;
72+
{{/supportUrlQuery}}
73+
74+
{{#models}}
75+
{{#model}}
76+
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#vendorExtensions.x-is-one-of-interface}}{{>oneof_interface}}{{/vendorExtensions.x-is-one-of-interface}}{{^vendorExtensions.x-is-one-of-interface}}{{>pojo}}{{/vendorExtensions.x-is-one-of-interface}}{{/isEnum}}
77+
{{/model}}
78+
{{/models}}

0 commit comments

Comments
 (0)