Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
59c67f2
Merge pull request #4 from OpenAPITools/master
jpfinne May 11, 2026
784da69
Merge branch 'OpenAPITools:master' into master
jpfinne May 12, 2026
9ee6075
Merge branch 'OpenAPITools:master' into master
jpfinne May 14, 2026
91ce7ba
Merge branch 'OpenAPITools:master' into master
jpfinne May 15, 2026
0808d0e
Merge branch 'OpenAPITools:master' into master
jpfinne May 17, 2026
46d9c9c
Merge branch 'OpenAPITools:master' into master
jpfinne May 18, 2026
7b6cf90
Merge branch 'OpenAPITools:master' into master
jpfinne May 30, 2026
b50a337
Merge branch 'OpenAPITools:master' into master
jpfinne Jun 1, 2026
ae1bff7
Merge branch 'OpenAPITools:master' into master
jpfinne Jun 2, 2026
5229d8d
Merge branch 'OpenAPITools:master' into master
jpfinne Jun 3, 2026
cdc74eb
Merge branch 'OpenAPITools:master' into master
jpfinne Jun 13, 2026
df30bd2
Merge branch 'OpenAPITools:master' into master
jpfinne Jul 4, 2026
246b21d
Merge branch 'OpenAPITools:master' into master
jpfinne Jul 8, 2026
8e39563
Merge branch 'OpenAPITools:master' into master
jpfinne Aug 1, 2026
deec130
Merge branch 'OpenAPITools:master' into master
jpfinne Aug 4, 2026
e1cf666
add jspecify @Nullable annotation to builder and toIndentedString for…
jpfinne Aug 4, 2026
236338d
include more use cases in jspecify.yaml
jpfinne Aug 4, 2026
356595c
include more use cases in jspecify.yaml
jpfinne Aug 4, 2026
f49accb
Regenerate test samples
jpfinne Aug 8, 2026
30a40a5
Merge remote-tracking branch 'refs/remotes/upstream/master' into feat…
jpfinne Aug 8, 2026
2740a6e
Regenerate test samples
jpfinne Aug 8, 2026
d64ea09
Merge remote-tracking branch 'upstream/master' into feature/jspecify_…
jpfinne Aug 8, 2026
bb0e7d8
Fix extra space in webclient single_request_parameter for toIndentedS…
jpfinne Aug 8, 2026
d381a73
Invalid sha for JSONTest.java !!!
jpfinne Aug 8, 2026
1ad3f1e
Support space at the end of the @Nullable annotation to avoid handlin…
jpfinne Aug 8, 2026
2ea64df
generate all arg constructor on restTemplate and webclient
jpfinne Aug 8, 2026
a46a2b3
Remove @Nullable on private toIndentedString
jpfinne Aug 8, 2026
7bd1863
Fix unit test
jpfinne Aug 8, 2026
64ce445
Fix unit test
jpfinne Aug 8, 2026
ecf0f73
Add regenerated samples with tags
jpfinne Aug 8, 2026
4cbbfad
Add regenerated samples with tags
jpfinne Aug 8, 2026
9f6d68d
Force rebuild
jpfinne Aug 9, 2026
e031b85
Force rebuild
jpfinne Aug 9, 2026
b75d455
Handling of resttemplate api Nullable arguments
jpfinne Aug 9, 2026
5ce5282
Merge remote-tracking branch 'upstream/master' into feature/jspecify_…
jpfinne Aug 9, 2026
ce877e4
Handling of resttemplate api Nullable arguments
jpfinne Aug 9, 2026
f0501ee
Rollback resttemplate api: not for this PR
jpfinne Aug 9, 2026
4d3cbf7
Add @Nullable on single_request_parameter
jpfinne Aug 9, 2026
282a4f7
Add @Nullable on useAbstractionForFiles
jpfinne Aug 10, 2026
a3e671f
Fix unittest
jpfinne Aug 10, 2026
7aba350
Merge remote-tracking branch 'upstream/master' into feature/jspecify_…
jpfinne Aug 10, 2026
3656352
Merge master and fix use useAbstractionForFiles=true for restclient a…
jpfinne Aug 10, 2026
bfabfc7
fix restclient api_test
jpfinne Aug 10, 2026
df96fba
Add sample for array of file
jpfinne Aug 10, 2026
8df500c
Fix unit tests
jpfinne Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/samples-java-client-jdk17.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ on:
- samples/client/petstore/java/apache-httpclient-jackson3/**
- samples/client/petstore/java/native-jackson3-jspecify/**
- samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/**
- samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify-openapiNullable/**
- samples/client/others/java/webclient-sealedInterface/**
- samples/client/others/java/webclient-sealedInterface_3_1/**
- samples/client/petstore/java/webclient-useSingleRequestParameter/**
Expand All @@ -30,6 +31,7 @@ on:
- samples/client/petstore/java/apache-httpclient-jackson3/**
- samples/client/petstore/java/native-jackson3-jspecify/**
- samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/**
- samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify-openapiNullable/**
- samples/client/others/java/webclient-sealedInterface/**
- samples/client/others/java/webclient-sealedInterface_3_1/**
- samples/client/petstore/java/webclient-useSingleRequestParameter/**
Expand Down Expand Up @@ -57,6 +59,7 @@ jobs:
- samples/client/petstore/java/restclient-springBoot4-jackson2
- samples/client/petstore/java/restclient-springBoot4-jackson3
- samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify
- samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify-openapiNullable
- samples/client/petstore/java/native-jackson3-jspecify
- samples/client/petstore/java/restclient-swagger2
- samples/client/petstore/java/restclient-useSingleRequestParameter
Expand Down
4 changes: 2 additions & 2 deletions bin/configs/java-native-jackson3-jspecify.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ validateSpec: false
additionalProperties:
artifactId: petstore-native-jackson3
hideGenerationTimestamp: "true"
generateBuilders: true
useReflectionEqualsHashCode: "true"
useJackson3: "true"
openApiNullable: "false"
useJspecify: true
generateBuilders: true
typeMappings:
OffsetDateTime: java.time.Instant
BigDecimal: java.math.BigDecimal
BigDecimal: java.math.BigDecimal
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
generatorName: java
outputDir: samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify-openapiNullable
library: restclient
inputSpec: modules/openapi-generator/src/test/resources/3_0/java/jspecify.yaml
templateDir: modules/openapi-generator/src/main/resources/Java
validateSpec: false
additionalProperties:
artifactId: petstore-restclient
hideGenerationTimestamp: "true"
containerDefaultToNull: "true"
useSpringBoot4: true
useJackson3: true
openApiNullable: true
useJspecify: true
generateBuilders: true
generateConstructorWithAllArgs: true
useSingleRequestParameter: true
useTags: true
typeMappings:
OffsetDateTime: java.time.Instant
BigDecimal: java.math.BigDecimal
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ additionalProperties:
useJackson3: true
openApiNullable: false
useJspecify: true
generateBuilders: true
generateConstructorWithAllArgs: true
useSingleRequestParameter: true
useAbstractionForFiles: true
useTags: true
typeMappings:
OffsetDateTime: java.time.Instant
BigDecimal: java.math.BigDecimal
1 change: 0 additions & 1 deletion bin/configs/java-resttemplate-springBoot4-jackson2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,3 @@ additionalProperties:
containerDefaultToNull: "true"
useJakartaEe: true
useSpringBoot4: true

Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ additionalProperties:
useJackson3: true
openApiNullable: false
useJspecify: true
generateBuilders: true
generateConstructorWithAllArgs: true
useSingleRequestParameter: true
useTags: true
typeMappings:
OffsetDateTime: java.time.Instant
BigDecimal: java.math.BigDecimal
4 changes: 4 additions & 0 deletions bin/configs/java-webclient-springBoot4-jackson3-jspecify.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ additionalProperties:
useJackson3: true
openApiNullable: false
useJspecify: true
generateBuilders: true
generateConstructorWithAllArgs: true
useSingleRequestParameter: true
useAbstractionForFiles: true
typeMappings:
OffsetDateTime: java.time.Instant
BigDecimal: java.math.BigDecimal
Original file line number Diff line number Diff line change
Expand Up @@ -2895,9 +2895,11 @@ public void execute(Template.Fragment fragment, Writer writer) throws IOExceptio
keptNullable = null;
String value = fragment.execute();
if (useJspecify) {
if (value.startsWith(nullableAnnotation)) {
// extract @Nullable annotation (starting with @ and ending with space)
String patternToFind = nullableAnnotation + " ";
if (value.startsWith(patternToFind)) {
keptNullable = value;
int idx = nullableAnnotation.length();
int idx = patternToFind.length();
// trim left
while (idx < value.length() && value.charAt(idx) == ' ') {
idx ++;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public static class Builder {{#parentModel}}extends {{classname}}.Builder {{/par
}

{{#vars}}
public {{classname}}.Builder {{name}}({{#removeAnnotations}}{{{datatypeWithEnum}}}{{/removeAnnotations}} {{name}}) {
public {{classname}}.Builder {{name}}({{>nullableArgument_builder}} {{name}}) {
{{#vendorExtensions.x-is-jackson-optional-nullable}}
this.instance.{{name}} = JsonNullable.<{{#removeAnnotations}}{{{datatypeWithEnum}}}{{/removeAnnotations}}>of({{name}});
{{/vendorExtensions.x-is-jackson-optional-nullable}}
Expand All @@ -32,7 +32,7 @@ public static class Builder {{#parentModel}}extends {{classname}}.Builder {{/par
{{/vars}}

{{#parentVars}}
public {{classname}}.Builder {{name}}({{#removeAnnotations}}{{{datatypeWithEnum}}}{{/removeAnnotations}} {{name}}) { // inherited: {{isInherited}}
public {{classname}}.Builder {{name}}({{>nullableArgument_builder}} {{name}}) { // inherited: {{isInherited}}
super.{{name}}({{name}});
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public class {{classname}} {
* @see <a href="{{url}}">{{summary}} Documentation</a>
{{/externalDocs}}
*/
private ResponseSpec {{operationId}}RequestCreation({{#allParams}}{{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullableArgument}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullableArgument}}{{/isFile}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws RestClientResponseException {
private ResponseSpec {{operationId}}RequestCreation({{#allParams}}{{>nullableArgumentForApi}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws RestClientResponseException {
Object postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}};
{{#allParams}}
{{#required}}
Expand Down Expand Up @@ -180,7 +180,7 @@ public class {{classname}} {
{{#isDeprecated}}
@Deprecated
{{/isDeprecated}}
public {{#returnType}}{{#isResponseFile}}{{#useAbstractionForFiles}}org.springframework.core.io.Resource{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{{returnType}}}{{/useAbstractionForFiles}}{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullableArgument}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullableArgument}}{{/isFile}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws RestClientResponseException {
public {{#returnType}}{{#isResponseFile}}{{#useAbstractionForFiles}}org.springframework.core.io.Resource{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{{returnType}}}{{/useAbstractionForFiles}}{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{>nullableArgumentForApi}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws RestClientResponseException {
{{#returnType}}ParameterizedTypeReference<{{#isResponseFile}}{{#useAbstractionForFiles}}org.springframework.core.io.Resource{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{{returnType}}}{{/useAbstractionForFiles}}{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}}> localVarReturnType = new ParameterizedTypeReference<>() {};{{/returnType}}{{^returnType}}ParameterizedTypeReference<Void> localVarReturnType = new ParameterizedTypeReference<>() {};{{/returnType}}
{{#returnType}}return {{/returnType}}{{operationId}}RequestCreation({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}).body(localVarReturnType);
}
Expand All @@ -203,7 +203,7 @@ public class {{classname}} {
{{#isDeprecated}}
@Deprecated
{{/isDeprecated}}
public {{#returnType}}ResponseEntity<{{#isResponseFile}}{{#useAbstractionForFiles}}org.springframework.core.io.Resource{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{{returnType}}}{{/useAbstractionForFiles}}{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}}>{{/returnType}}{{^returnType}}ResponseEntity<Void>{{/returnType}} {{operationId}}WithHttpInfo({{#allParams}}{{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullableArgument}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullableArgument}}{{/isFile}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws RestClientResponseException {
public {{#returnType}}ResponseEntity<{{#isResponseFile}}{{#useAbstractionForFiles}}org.springframework.core.io.Resource{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{{returnType}}}{{/useAbstractionForFiles}}{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}}>{{/returnType}}{{^returnType}}ResponseEntity<Void>{{/returnType}} {{operationId}}WithHttpInfo({{#allParams}}{{>nullableArgumentForApi}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws RestClientResponseException {
{{#returnType}}ParameterizedTypeReference<{{#isResponseFile}}{{#useAbstractionForFiles}}org.springframework.core.io.Resource{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{{returnType}}}{{/useAbstractionForFiles}}{{/isResponseFile}}{{^isResponseFile}}{{{returnType}}}{{/isResponseFile}}> localVarReturnType = new ParameterizedTypeReference<>() {};{{/returnType}}{{^returnType}}ParameterizedTypeReference<Void> localVarReturnType = new ParameterizedTypeReference<>() {};{{/returnType}}
return {{operationId}}RequestCreation({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}).toEntity(localVarReturnType);
}
Expand All @@ -227,7 +227,7 @@ public class {{classname}} {
{{#isDeprecated}}
@Deprecated
{{/isDeprecated}}
public ResponseSpec {{operationId}}WithResponseSpec({{#allParams}}{{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullableArgument}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullableArgument}}{{/isFile}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws RestClientResponseException {
public ResponseSpec {{operationId}}WithResponseSpec({{#allParams}}{{>nullableArgumentForApi}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) throws RestClientResponseException {
return {{operationId}}RequestCreation({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
}
{{/operation}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@
{{^hasSingleParam}}

{{^staticRequest}}
public record {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}Request({{#allParams}}{{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullable_var_annotations}} {{{dataType}}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullable_var_annotations}} {{{dataType}}}{{/isFile}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}){}
public record {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}Request({{#allParams}}{{>nullableArgumentForApi}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}){}
{{/staticRequest}}
{{#staticRequest}}
public static class {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}Request {
{{#allParams}}
private {{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullable_var_annotations}} {{{dataType}}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullable_var_annotations}} {{{dataType}}}{{/isFile}} {{paramName}};
private {{>nullableArgumentForApi}} {{paramName}};
{{/allParams}}

public {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}Request() {}

public {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}Request({{#allParams}}{{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullable_var_annotations}} {{{dataType}}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullable_var_annotations}} {{{dataType}}}{{/isFile}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) {
public {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}Request({{#allParams}}{{>nullableArgumentForApi}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) {
{{#allParams}}
this.{{paramName}} = {{paramName}};
{{/allParams}}
}

{{#allParams}}
public {{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullable_var_annotations}} {{{dataType}}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullable_var_annotations}} {{{dataType}}}{{/isFile}} {{paramName}}() {
public {{>nullableArgumentForApi}} {{paramName}}() {
return this.{{paramName}};
}
public {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}Request {{paramName}}({{#isFile}}{{#useAbstractionForFiles}}{{#collectionFormat}}java.util.Collection<org.springframework.core.io.Resource>{{/collectionFormat}}{{^collectionFormat}}org.springframework.core.io.Resource{{/collectionFormat}}{{/useAbstractionForFiles}}{{^useAbstractionForFiles}}{{>nullable_var_annotations}} {{{dataType}}}{{/useAbstractionForFiles}}{{/isFile}}{{^isFile}}{{>nullable_var_annotations}} {{{dataType}}}{{/isFile}} {{paramName}}) {
public {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}Request {{paramName}}({{>nullableArgumentForApi}} {{paramName}}) {
this.{{paramName}} = {{paramName}};
return this;
}
Expand Down
Loading
Loading