Skip to content

Commit 876a6c5

Browse files
committed
fix: require Spring Boot 4 for client registration id
1 parent 83ca4ec commit 876a6c5

58 files changed

Lines changed: 130 additions & 196 deletions

File tree

Some content is hidden

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

bin/configs/spring-http-interface-oauth.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ additionalProperties:
1010
modelNameSuffix: 'Dto'
1111
generatedConstructorWithRequiredArgs: "false"
1212
clientRegistrationId: "petstore-oauth"
13-
parentGroupId: "org.springframework.boot"
14-
parentArtifactId: "spring-boot-starter-parent"
15-
parentVersion: "3.5.0"
13+
useSpringBoot4: "true"
14+
useJackson3: true
15+
openApiNullable: false

docs/generators/java-camel.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
4343
|camelSecurityDefinitions|generate camel security definitions| |true|
4444
|camelUseDefaultValidationErrorProcessor|generate default validation error processor| |true|
4545
|camelValidationErrorProcessor|validation error processor bean name| |validationErrorProcessor|
46-
|clientRegistrationId|Client registration ID for OAuth2 in Spring HTTP Interface (@ClientRegistrationId annotation).| |null|
46+
|clientRegistrationId|Client registration ID for OAuth2 in Spring HTTP Interface (@ClientRegistrationId annotation). Requires library=spring-http-interface and useSpringBoot4=true (Spring Security 7).| |null|
4747
|configPackage|configuration package for generated code| |org.openapitools.configuration|
4848
|containerDefaultToNull|Set containers (array, set, map) default to null| |false|
4949
|dateLibrary|Option. Date library to use|<dl><dt>**joda**</dt><dd>Joda (for legacy app only)</dd><dt>**legacy**</dt><dd>Legacy java.util.Date</dd><dt>**java8-localdatetime**</dt><dd>Java 8 using LocalDateTime (for legacy app only)</dd><dt>**java8**</dt><dd>Java 8 native JSR310 (preferred for jdk 1.8+)</dd></dl>|java8|

docs/generators/spring.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
3636
|bigDecimalAsString|Treat BigDecimal values as Strings to avoid precision loss.| |false|
3737
|booleanGetterPrefix|Set booleanGetterPrefix| |get|
3838
|camelCaseDollarSign|Fix camelCase when starting with $ sign. when true : $Value when false : $value| |false|
39-
|clientRegistrationId|Client registration ID for OAuth2 in Spring HTTP Interface (@ClientRegistrationId annotation).| |null|
39+
|clientRegistrationId|Client registration ID for OAuth2 in Spring HTTP Interface (@ClientRegistrationId annotation). Requires library=spring-http-interface and useSpringBoot4=true (Spring Security 7).| |null|
4040
|configPackage|configuration package for generated code| |org.openapitools.configuration|
4141
|containerDefaultToNull|Set containers (array, set, map) default to null| |false|
4242
|dateLibrary|Option. Date library to use|<dl><dt>**joda**</dt><dd>Joda (for legacy app only)</dd><dt>**legacy**</dt><dd>Legacy java.util.Date</dd><dt>**java8-localdatetime**</dt><dd>Java 8 using LocalDateTime (for legacy app only)</dd><dt>**java8**</dt><dd>Java 8 native JSR310 (preferred for jdk 1.8+)</dd></dl>|java8|

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ public SpringCodegen() {
347347
.defaultValue("false")
348348
);
349349
cliOptions.add(CliOption.newBoolean(USE_JSPECIFY, "Use Jspecify for null checks", useJspecify));
350-
cliOptions.add(CliOption.newString(CLIENT_REGISTRATION_ID, "Client registration ID for OAuth2 in Spring HTTP Interface (@ClientRegistrationId annotation)."));
350+
cliOptions.add(CliOption.newString(CLIENT_REGISTRATION_ID, "Client registration ID for OAuth2 in Spring HTTP Interface (@ClientRegistrationId annotation). Requires library=spring-http-interface and useSpringBoot4=true (Spring Security 7)."));
351351
supportedLibraries.put(SPRING_BOOT, "Spring-boot Server application.");
352352
supportedLibraries.put(SPRING_CLOUD_LIBRARY,
353353
"Spring-Cloud-Feign client with Spring-Boot auto-configured settings.");
@@ -582,6 +582,14 @@ public void processOpts() {
582582
if (isUseSpringBoot4()) {
583583
setUseSpringBoot3(false);
584584
}
585+
if (isNotEmpty(clientRegistrationId)) {
586+
if (!SPRING_HTTP_INTERFACE.equals(library)) {
587+
throw new IllegalArgumentException(CLIENT_REGISTRATION_ID + " is only supported with the " + SPRING_HTTP_INTERFACE + " library");
588+
}
589+
if (!isUseSpringBoot4()) {
590+
throw new IllegalArgumentException(CLIENT_REGISTRATION_ID + " requires " + USE_SPRING_BOOT4 + "=true because @ClientRegistrationId is provided by Spring Security 7");
591+
}
592+
}
585593

586594
if (isUseSpringBoot3() || isUseSpringBoot4()) {
587595
if (AnnotationLibrary.SWAGGER1.equals(getAnnotationLibrary())) {

modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-http-interface/pom-sb3.mustache

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,6 @@
117117
<artifactId>spring-boot-starter-validation</artifactId>
118118
</dependency>
119119
{{/performBeanValidation}}{{/useBeanValidation}}
120-
{{#clientRegistrationId}}
121-
<dependency>
122-
<groupId>org.springframework.boot</groupId>
123-
<artifactId>spring-boot-starter-oauth2-client</artifactId>
124-
</dependency>
125-
{{/clientRegistrationId}}
126120
<dependency>
127121
<groupId>org.springframework.boot</groupId>
128122
<artifactId>spring-boot-starter-test</artifactId>

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6588,6 +6588,7 @@ public void shouldAddNullableImportForArrayTypeModels() throws IOException {
65886588
public void testClientRegistrationIdAnnotation() throws IOException {
65896589
final SpringCodegen codegen = new SpringCodegen();
65906590
codegen.setLibrary("spring-http-interface");
6591+
codegen.setUseSpringBoot4(true);
65916592
codegen.setClientRegistrationId("my-oauth-client");
65926593

65936594
final Map<String, File> files = generateFiles(codegen, "src/test/resources/3_0/petstore.yaml");
@@ -6603,6 +6604,7 @@ public void testClientRegistrationIdAnnotation() throws IOException {
66036604
public void testClientRegistrationIdAnnotationNotPresentWhenNotConfigured() throws IOException {
66046605
final SpringCodegen codegen = new SpringCodegen();
66056606
codegen.setLibrary("spring-http-interface");
6607+
codegen.setUseSpringBoot4(true);
66066608
// clientRegistrationId not set
66076609

66086610
final Map<String, File> files = generateFiles(codegen, "src/test/resources/3_0/petstore.yaml");
@@ -6611,6 +6613,54 @@ public void testClientRegistrationIdAnnotationNotPresentWhenNotConfigured() thro
66116613
assertFileNotContains(files.get("PetApi.java").toPath(), "@ClientRegistrationId", "ClientRegistrationId");
66126614
}
66136615

6616+
@Test
6617+
public void shouldRefuseClientRegistrationIdWithoutSpringBoot4() throws IOException {
6618+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
6619+
output.deleteOnExit();
6620+
6621+
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/petstore.yaml");
6622+
final SpringCodegen codegen = new SpringCodegen();
6623+
codegen.setOpenAPI(openAPI);
6624+
codegen.setOutputDir(output.getAbsolutePath());
6625+
codegen.setLibrary("spring-http-interface");
6626+
codegen.setClientRegistrationId("my-oauth-client");
6627+
6628+
ClientOptInput input = new ClientOptInput();
6629+
input.openAPI(openAPI);
6630+
input.config(codegen);
6631+
6632+
Generator generator = new DefaultGenerator()
6633+
.opts(input);
6634+
6635+
Assertions.assertThatExceptionOfType(IllegalArgumentException.class)
6636+
.isThrownBy(generator::generate)
6637+
.withMessageContaining(SpringCodegen.USE_SPRING_BOOT4);
6638+
}
6639+
6640+
@Test
6641+
public void shouldRefuseClientRegistrationIdOutsideSpringHttpInterface() throws IOException {
6642+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
6643+
output.deleteOnExit();
6644+
6645+
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/petstore.yaml");
6646+
final SpringCodegen codegen = new SpringCodegen();
6647+
codegen.setOpenAPI(openAPI);
6648+
codegen.setOutputDir(output.getAbsolutePath());
6649+
codegen.setUseSpringBoot4(true);
6650+
codegen.setClientRegistrationId("my-oauth-client");
6651+
6652+
ClientOptInput input = new ClientOptInput();
6653+
input.openAPI(openAPI);
6654+
input.config(codegen);
6655+
6656+
Generator generator = new DefaultGenerator()
6657+
.opts(input);
6658+
6659+
Assertions.assertThatExceptionOfType(IllegalArgumentException.class)
6660+
.isThrownBy(generator::generate)
6661+
.withMessageContaining("spring-http-interface");
6662+
}
6663+
66146664
@Test
66156665
public void shouldRefuseJackson3WithoutSpringboot4() throws IOException {
66166666
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();

samples/client/petstore/spring-http-interface-oauth/README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ generatorName: spring
1616
library: spring-http-interface
1717
additionalProperties:
1818
clientRegistrationId: "petstore-oauth"
19+
useSpringBoot4: "true"
20+
useJackson3: true
21+
openApiNullable: false
1922
```
2023
2124
Or via command line:
@@ -24,7 +27,7 @@ Or via command line:
2427
openapi-generator-cli generate \
2528
-g spring \
2629
--library spring-http-interface \
27-
--additional-properties clientRegistrationId=petstore-oauth \
30+
--additional-properties clientRegistrationId=petstore-oauth,useSpringBoot4=true,useJackson3=true,openApiNullable=false \
2831
-i petstore.yaml \
2932
-o ./output
3033
```
@@ -52,8 +55,8 @@ This annotation is part of Spring Security's OAuth2 integration for HTTP Service
5255

5356
### Requirements
5457

55-
- Spring Boot 3.5+
56-
- Spring Security 6.5+
58+
- Spring Boot 4.x
59+
- Spring Security 7.x
5760

5861
### Application Properties
5962

samples/client/petstore/spring-http-interface-oauth/pom.xml

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
<parent>
1313
<groupId>org.springframework.boot</groupId>
1414
<artifactId>spring-boot-starter-parent</artifactId>
15-
<version>3.5.0</version>
15+
<version>4.0.1</version>
16+
<relativePath/> <!-- lookup parent from repository -->
1617
</parent>
1718

1819
<build>
@@ -45,7 +46,7 @@
4546
<dependencies>
4647
<dependency>
4748
<groupId>org.springframework.boot</groupId>
48-
<artifactId>spring-boot-starter-web</artifactId>
49+
<artifactId>spring-boot-starter-restclient</artifactId>
4950
</dependency>
5051
<!-- @Nullable annotation -->
5152
<dependency>
@@ -57,23 +58,14 @@
5758
<groupId>jakarta.validation</groupId>
5859
<artifactId>jakarta.validation-api</artifactId>
5960
</dependency>
60-
<dependency>
61-
<groupId>com.fasterxml.jackson.datatype</groupId>
62-
<artifactId>jackson-datatype-jsr310</artifactId>
63-
</dependency>
64-
<dependency>
65-
<groupId>org.openapitools</groupId>
66-
<artifactId>jackson-databind-nullable</artifactId>
67-
<version>0.2.10</version>
68-
</dependency>
6961

7062
<dependency>
7163
<groupId>org.springframework.boot</groupId>
7264
<artifactId>spring-boot-starter-oauth2-client</artifactId>
7365
</dependency>
7466
<dependency>
7567
<groupId>org.springframework.boot</groupId>
76-
<artifactId>spring-boot-starter-test</artifactId>
68+
<artifactId>spring-boot-starter-restclient-test</artifactId>
7769
<scope>test</scope>
7870
</dependency>
7971
</dependencies>

samples/client/petstore/spring-http-interface-oauth/src/main/java/org/openapitools/model/AdditionalPropertiesAnyTypeDto.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.fasterxml.jackson.annotation.JsonCreator;
77
import com.fasterxml.jackson.annotation.JsonTypeName;
88
import org.springframework.lang.Nullable;
9-
import org.openapitools.jackson.nullable.JsonNullable;
109
import java.time.OffsetDateTime;
1110
import jakarta.validation.constraints.NotNull;
1211

samples/client/petstore/spring-http-interface-oauth/src/main/java/org/openapitools/model/AdditionalPropertiesArrayDto.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import com.fasterxml.jackson.annotation.JsonTypeName;
88
import java.util.List;
99
import org.springframework.lang.Nullable;
10-
import org.openapitools.jackson.nullable.JsonNullable;
1110
import java.time.OffsetDateTime;
1211
import jakarta.validation.constraints.NotNull;
1312

0 commit comments

Comments
 (0)