Skip to content

Commit 63df7ca

Browse files
Add samples for when using the useSealed setting for Spring (#21515)
* Add samples for when using the useSealed setting for Spring * Add the new sample generation to the workflow
1 parent 98b315c commit 63df7ca

40 files changed

+4455
-13
lines changed

.github/workflows/samples-spring-jdk17.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ on:
1010
- samples/server/petstore/springboot-lombok-tostring
1111
- samples/server/petstore/springboot-file-delegate-optional
1212
- samples/server/petstore/springboot-petstore-with-api-response-examples
13+
- samples/server/petstore/spring-boot-oneof-sealed
1314
pull_request:
1415
paths:
1516
- samples/openapi3/client/petstore/spring-cloud-3-with-optional
@@ -19,6 +20,7 @@ on:
1920
- samples/server/petstore/springboot-lombok-tostring
2021
- samples/server/petstore/springboot-file-delegate-optional
2122
- samples/server/petstore/springboot-petstore-with-api-response-examples
23+
- samples/server/petstore/spring-boot-oneof-sealed
2224
jobs:
2325
build:
2426
name: Build Java Spring (JDK17)
@@ -36,6 +38,7 @@ jobs:
3638
- samples/server/petstore/springboot-lombok-tostring
3739
- samples/server/petstore/springboot-file-delegate-optional
3840
- samples/server/petstore/springboot-petstore-with-api-response-examples
41+
- samples/server/petstore/spring-boot-oneof-sealed
3942
steps:
4043
- uses: actions/checkout@v4
4144
- uses: actions/setup-java@v4
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
generatorName: spring
2+
outputDir: samples/openapi3/server/petstore/spring-boot-oneof-sealed
3+
inputSpec: modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml
4+
templateDir: modules/openapi-generator/src/main/resources/JavaSpring
5+
additionalProperties:
6+
groupId: org.openapitools.openapi3
7+
documentationProvider: springdoc
8+
artifactId: springboot-oneof-sealed
9+
snapshotVersion: "true"
10+
hideGenerationTimestamp: "true"
11+
generateBuilders: true
12+
useOneOfInterfaces: true
13+
useSealed: true
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#useSealed}}{{#permits}}{{#-first}}permits {{/-first}}{{{.}}}{{^-last}}, {{/-last}}{{/permits}} {{/useSealed}}
1+
{{#useSealed}}{{#permits}}{{#-first}}permits {{/-first}}{{{.}}}{{^-last}}, {{/-last}}{{#-last}} {{/-last}}{{/permits}}{{/useSealed}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2278,36 +2278,39 @@ public static Object[][] sealedScenarios() {
22782278
{"oneOf_nonPrimitive.yaml", Map.of(
22792279
"Example.java", "public interface Example {")},
22802280
{"oneOf_primitive.yaml", Map.of(
2281-
"Child.java", "public final class Child extends RepresentationModel<Child> implements Example {",
2281+
"Child.java", "public final class Child extends RepresentationModel<Child> implements Example {",
22822282
"Example.java", "public sealed interface Example permits Child {")},
22832283
{"oneOf_primitiveAndArray.yaml", Map.of(
22842284
"Example.java", "public interface Example {")},
22852285
{"oneOf_reuseRef.yaml", Map.of(
22862286
"Fruit.java", "public sealed interface Fruit permits Apple, Banana {",
2287-
"Banana.java", "public final class Banana extends RepresentationModel<Banana> implements Fruit {",
2288-
"Apple.java", "public final class Apple extends RepresentationModel<Apple> implements Fruit {")},
2287+
"Banana.java", "public final class Banana extends RepresentationModel<Banana> implements Fruit {",
2288+
"Apple.java", "public final class Apple extends RepresentationModel<Apple> implements Fruit {")},
22892289
{"oneOf_twoPrimitives.yaml", Map.of(
2290-
"MyExamplePostRequest.java", "public interface MyExamplePostRequest {")},
2290+
"MyExamplePostRequest.java", "public interface MyExamplePostRequest {")},
22912291
{"oneOfArrayMapImport.yaml", Map.of(
22922292
"Fruit.java", "public interface Fruit {",
2293-
"Grape.java", "public final class Grape extends RepresentationModel<Grape> {",
2294-
"Apple.java", "public final class Apple extends RepresentationModel<Apple> {")},
2293+
"Grape.java", "public final class Grape extends RepresentationModel<Grape> {",
2294+
"Apple.java", "public final class Apple extends RepresentationModel<Apple> {")},
22952295
{"oneOfDiscriminator.yaml", Map.of(
22962296
"FruitAllOfDisc.java", "public sealed interface FruitAllOfDisc permits AppleAllOfDisc, BananaAllOfDisc {",
2297-
"FruitReqDisc.java", "public sealed interface FruitReqDisc permits AppleReqDisc, BananaReqDisc {\n")}
2297+
"AppleAllOfDisc.java", "public final class AppleAllOfDisc extends RepresentationModel<AppleAllOfDisc> implements FruitAllOfDisc {",
2298+
"BananaAllOfDisc.java", "public final class BananaAllOfDisc extends RepresentationModel<BananaAllOfDisc> implements FruitAllOfDisc {",
2299+
"FruitReqDisc.java", "public sealed interface FruitReqDisc permits AppleReqDisc, BananaReqDisc {",
2300+
"AppleReqDisc.java", "public final class AppleReqDisc extends RepresentationModel<AppleReqDisc> implements FruitReqDisc {",
2301+
"BananaReqDisc.java", "public final class BananaReqDisc extends RepresentationModel<BananaReqDisc> implements FruitReqDisc {")}
22982302
};
22992303
}
23002304

23012305
@Test(dataProvider = "sealedScenarios", description = "sealed scenarios")
2302-
public void sealedScenarios(String apiFile, Map<String, String> definitions) throws IOException {
2303-
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
2304-
output.deleteOnExit();
2305-
String outputPath = output.getAbsolutePath().replace('\\', '/');
2306+
public void sealedScenarios(String apiFile, Map<String, String> definitions) {
2307+
Path output = newTempFolder();
2308+
String outputPath = output.toString().replace('\\', '/');
23062309
OpenAPI openAPI = new OpenAPIParser()
23072310
.readLocation("src/test/resources/3_0/" + apiFile, null, new ParseOptions()).getOpenAPI();
23082311

23092312
SpringCodegen codegen = new SpringCodegen();
2310-
codegen.setOutputDir(output.getAbsolutePath());
2313+
codegen.setOutputDir(outputPath);
23112314
codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true");
23122315
codegen.setUseOneOfInterfaces(true);
23132316
codegen.setUseSealed(true);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# OpenAPI Generator Ignore
2+
# Generated by openapi-generator https://github.com/openapitools/openapi-generator
3+
4+
# Use this file to prevent files from being overwritten by the generator.
5+
# The patterns follow closely to .gitignore or .dockerignore.
6+
7+
# As an example, the C# client generator defines ApiClient.cs.
8+
# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
9+
#ApiClient.cs
10+
11+
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
12+
#foo/*/qux
13+
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
14+
15+
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
16+
#foo/**/qux
17+
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
18+
19+
# You can also negate patterns with an exclamation (!).
20+
# For example, you can ignore all files in a docs folder with the file extension .md:
21+
#docs/*.md
22+
# Then explicitly reverse the ignore rule for a single file:
23+
#!docs/README.md
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
README.md
2+
pom.xml
3+
src/main/java/org/openapitools/OpenApiGeneratorApplication.java
4+
src/main/java/org/openapitools/RFC3339DateFormat.java
5+
src/main/java/org/openapitools/api/ApiUtil.java
6+
src/main/java/org/openapitools/api/BarApi.java
7+
src/main/java/org/openapitools/api/FooApi.java
8+
src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java
9+
src/main/java/org/openapitools/configuration/HomeController.java
10+
src/main/java/org/openapitools/configuration/SpringDocConfiguration.java
11+
src/main/java/org/openapitools/model/Addressable.java
12+
src/main/java/org/openapitools/model/Apple.java
13+
src/main/java/org/openapitools/model/Banana.java
14+
src/main/java/org/openapitools/model/Bar.java
15+
src/main/java/org/openapitools/model/BarCreate.java
16+
src/main/java/org/openapitools/model/BarRef.java
17+
src/main/java/org/openapitools/model/BarRefOrValue.java
18+
src/main/java/org/openapitools/model/Entity.java
19+
src/main/java/org/openapitools/model/EntityRef.java
20+
src/main/java/org/openapitools/model/Extensible.java
21+
src/main/java/org/openapitools/model/Foo.java
22+
src/main/java/org/openapitools/model/FooRef.java
23+
src/main/java/org/openapitools/model/FooRefOrValue.java
24+
src/main/java/org/openapitools/model/Fruit.java
25+
src/main/java/org/openapitools/model/FruitType.java
26+
src/main/java/org/openapitools/model/Pasta.java
27+
src/main/java/org/openapitools/model/Pizza.java
28+
src/main/java/org/openapitools/model/PizzaSpeziale.java
29+
src/main/resources/application.properties
30+
src/main/resources/openapi.yaml
31+
src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7.15.0-SNAPSHOT
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# OpenAPI generated server
2+
3+
Spring Boot Server
4+
5+
## Overview
6+
This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project.
7+
By using the [OpenAPI-Spec](https://openapis.org), you can easily generate a server stub.
8+
This is an example of building a OpenAPI-enabled server in Java using the SpringBoot framework.
9+
10+
11+
The underlying library integrating OpenAPI to Spring Boot is [springdoc](https://springdoc.org).
12+
Springdoc will generate an OpenAPI v3 specification based on the generated Controller and Model classes.
13+
The specification is available to download using the following url:
14+
http://localhost:8080/v3/api-docs/
15+
16+
Start your server as a simple java application
17+
18+
You can view the api documentation in swagger-ui by pointing to
19+
http://localhost:8080/swagger-ui.html
20+
21+
Change default port value in application.properties
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
2+
<modelVersion>4.0.0</modelVersion>
3+
<groupId>org.openapitools.openapi3</groupId>
4+
<artifactId>springboot-oneof-sealed</artifactId>
5+
<packaging>jar</packaging>
6+
<name>springboot-oneof-sealed</name>
7+
<version>0.0.1-SNAPSHOT</version>
8+
<properties>
9+
<java.version>17</java.version>
10+
<maven.compiler.source>${java.version}</maven.compiler.source>
11+
<maven.compiler.target>${java.version}</maven.compiler.target>
12+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13+
<springdoc.version>1.6.14</springdoc.version>
14+
<swagger-ui.version>5.3.1</swagger-ui.version>
15+
</properties>
16+
<parent>
17+
<groupId>org.springframework.boot</groupId>
18+
<artifactId>spring-boot-starter-parent</artifactId>
19+
<version>2.7.15</version>
20+
<relativePath/> <!-- lookup parent from repository -->
21+
</parent>
22+
<build>
23+
<sourceDirectory>src/main/java</sourceDirectory>
24+
<plugins>
25+
<plugin>
26+
<groupId>org.springframework.boot</groupId>
27+
<artifactId>spring-boot-maven-plugin</artifactId>
28+
<configuration>
29+
</configuration>
30+
</plugin>
31+
</plugins>
32+
</build>
33+
<dependencies>
34+
<dependency>
35+
<groupId>org.springframework.boot</groupId>
36+
<artifactId>spring-boot-starter-web</artifactId>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.springframework.data</groupId>
40+
<artifactId>spring-data-commons</artifactId>
41+
</dependency>
42+
<!--SpringDoc dependencies -->
43+
<dependency>
44+
<groupId>org.springdoc</groupId>
45+
<artifactId>springdoc-openapi-ui</artifactId>
46+
<version>${springdoc.version}</version>
47+
</dependency>
48+
<!-- @Nullable annotation -->
49+
<dependency>
50+
<groupId>com.google.code.findbugs</groupId>
51+
<artifactId>jsr305</artifactId>
52+
<version>3.0.2</version>
53+
</dependency>
54+
<dependency>
55+
<groupId>com.fasterxml.jackson.dataformat</groupId>
56+
<artifactId>jackson-dataformat-yaml</artifactId>
57+
</dependency>
58+
<dependency>
59+
<groupId>com.fasterxml.jackson.datatype</groupId>
60+
<artifactId>jackson-datatype-jsr310</artifactId>
61+
</dependency>
62+
<dependency>
63+
<groupId>org.openapitools</groupId>
64+
<artifactId>jackson-databind-nullable</artifactId>
65+
<version>0.2.6</version>
66+
</dependency>
67+
<!-- Bean Validation API support -->
68+
<dependency>
69+
<groupId>org.springframework.boot</groupId>
70+
<artifactId>spring-boot-starter-validation</artifactId>
71+
</dependency>
72+
<dependency>
73+
<groupId>com.fasterxml.jackson.core</groupId>
74+
<artifactId>jackson-databind</artifactId>
75+
</dependency>
76+
<dependency>
77+
<groupId>org.springframework.boot</groupId>
78+
<artifactId>spring-boot-starter-test</artifactId>
79+
<scope>test</scope>
80+
</dependency>
81+
</dependencies>
82+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.openapitools;
2+
3+
import com.fasterxml.jackson.databind.Module;
4+
import org.openapitools.jackson.nullable.JsonNullableModule;
5+
import org.springframework.boot.SpringApplication;
6+
import org.springframework.boot.autoconfigure.SpringBootApplication;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.ComponentScan;
9+
import org.springframework.context.annotation.FilterType;
10+
import org.springframework.context.annotation.FullyQualifiedAnnotationBeanNameGenerator;
11+
12+
@SpringBootApplication(
13+
nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class
14+
)
15+
@ComponentScan(
16+
basePackages = {"org.openapitools", "org.openapitools.api" , "org.openapitools.configuration"},
17+
nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class
18+
)
19+
public class OpenApiGeneratorApplication {
20+
21+
public static void main(String[] args) {
22+
SpringApplication.run(OpenApiGeneratorApplication.class, args);
23+
}
24+
25+
@Bean(name = "org.openapitools.OpenApiGeneratorApplication.jsonNullableModule")
26+
public Module jsonNullableModule() {
27+
return new JsonNullableModule();
28+
}
29+
30+
}

0 commit comments

Comments
 (0)