Skip to content

Commit 30a7b27

Browse files
committed
Fix breaking changes in samples
Issue gh-2090 gh-2091
1 parent d7c6564 commit 30a7b27

File tree

7 files changed

+60
-64
lines changed

7 files changed

+60
-64
lines changed

samples/default-authorizationserver/samples-default-authorizationserver.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ repositories {
2020
dependencies {
2121
implementation "org.springframework.boot:spring-boot-starter-web"
2222
implementation "org.springframework.boot:spring-boot-starter-security"
23+
implementation "org.springframework.boot:spring-boot-starter-oauth2-authorization-server"
2324
implementation project(":spring-security-oauth2-authorization-server")
2425

2526
testImplementation "org.springframework.boot:spring-boot-starter-test"

samples/demo-authorizationserver/src/main/java/sample/config/TomcatServerConfig.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2024 the original author or authors.
2+
* Copyright 2020-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
1717

1818
import org.apache.catalina.connector.Connector;
1919

20-
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
20+
import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory;
2121
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
2222
import org.springframework.context.annotation.Bean;
2323
import org.springframework.context.annotation.Configuration;
@@ -33,7 +33,7 @@ public class TomcatServerConfig {
3333

3434
@Bean
3535
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> connectorCustomizer() {
36-
return (tomcat) -> tomcat.addAdditionalTomcatConnectors(createHttpConnector());
36+
return (tomcat) -> tomcat.addAdditionalConnectors(createHttpConnector());
3737
}
3838

3939
private Connector createHttpConnector() {

samples/demo-authorizationserver/src/main/java/sample/web/DefaultErrorController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2023 the original author or authors.
2+
* Copyright 2020-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
1818
import jakarta.servlet.RequestDispatcher;
1919
import jakarta.servlet.http.HttpServletRequest;
2020

21-
import org.springframework.boot.web.servlet.error.ErrorController;
21+
import org.springframework.boot.webmvc.error.ErrorController;
2222
import org.springframework.stereotype.Controller;
2323
import org.springframework.ui.Model;
2424
import org.springframework.util.StringUtils;

samples/demo-client/src/main/java/sample/authorization/OAuth2DeviceAccessTokenResponseClient.java

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2023 the original author or authors.
2+
* Copyright 2020-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,10 +15,7 @@
1515
*/
1616
package sample.authorization;
1717

18-
import java.util.Arrays;
19-
2018
import org.springframework.http.HttpHeaders;
21-
import org.springframework.http.RequestEntity;
2219
import org.springframework.http.converter.FormHttpMessageConverter;
2320
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
2421
import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler;
@@ -31,34 +28,37 @@
3128
import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter;
3229
import org.springframework.util.LinkedMultiValueMap;
3330
import org.springframework.util.MultiValueMap;
31+
import org.springframework.web.client.RestClient;
3432
import org.springframework.web.client.RestClientException;
35-
import org.springframework.web.client.RestOperations;
36-
import org.springframework.web.client.RestTemplate;
3733

3834
/**
3935
* @author Steve Riesenberg
4036
* @since 1.1
4137
*/
4238
public final class OAuth2DeviceAccessTokenResponseClient implements OAuth2AccessTokenResponseClient<OAuth2DeviceGrantRequest> {
4339

44-
private RestOperations restOperations;
40+
private RestClient restClient;
4541

4642
public OAuth2DeviceAccessTokenResponseClient() {
47-
RestTemplate restTemplate = new RestTemplate(Arrays.asList(new FormHttpMessageConverter(),
48-
new OAuth2AccessTokenResponseHttpMessageConverter()));
49-
restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler());
50-
this.restOperations = restTemplate;
43+
this.restClient = RestClient.builder()
44+
.messageConverters((messageConverters) -> {
45+
messageConverters.clear();
46+
messageConverters.add(new FormHttpMessageConverter());
47+
messageConverters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
48+
})
49+
.defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
50+
.build();
5151
}
5252

53-
public void setRestOperations(RestOperations restOperations) {
54-
this.restOperations = restOperations;
53+
public void setRestClient(RestClient restClient) {
54+
this.restClient = restClient;
5555
}
5656

5757
@Override
5858
public OAuth2AccessTokenResponse getTokenResponse(OAuth2DeviceGrantRequest deviceGrantRequest) {
5959
ClientRegistration clientRegistration = deviceGrantRequest.getClientRegistration();
6060

61-
HttpHeaders headers = new HttpHeaders();
61+
HttpHeaders headerParameters = new HttpHeaders();
6262
/*
6363
* This sample demonstrates the use of a public client that does not
6464
* store credentials or authenticate with the authorization server.
@@ -71,23 +71,23 @@ public OAuth2AccessTokenResponse getTokenResponse(OAuth2DeviceGrantRequest devic
7171
* OAuth 2.0 Token Request with a clientId/clientSecret.
7272
*/
7373
if (!clientRegistration.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.NONE)) {
74-
headers.setBasicAuth(clientRegistration.getClientId(), clientRegistration.getClientSecret());
74+
headerParameters.setBasicAuth(clientRegistration.getClientId(), clientRegistration.getClientSecret());
7575
}
7676

7777
MultiValueMap<String, Object> requestParameters = new LinkedMultiValueMap<>();
7878
requestParameters.add(OAuth2ParameterNames.GRANT_TYPE, deviceGrantRequest.getGrantType().getValue());
7979
requestParameters.add(OAuth2ParameterNames.CLIENT_ID, clientRegistration.getClientId());
8080
requestParameters.add(OAuth2ParameterNames.DEVICE_CODE, deviceGrantRequest.getDeviceCode());
8181

82-
// @formatter:off
83-
RequestEntity<MultiValueMap<String, Object>> requestEntity =
84-
RequestEntity.post(deviceGrantRequest.getClientRegistration().getProviderDetails().getTokenUri())
85-
.headers(headers)
86-
.body(requestParameters);
87-
// @formatter:on
88-
8982
try {
90-
return this.restOperations.exchange(requestEntity, OAuth2AccessTokenResponse.class).getBody();
83+
// @formatter:off
84+
return this.restClient.post()
85+
.uri(deviceGrantRequest.getClientRegistration().getProviderDetails().getTokenUri())
86+
.headers((headers) -> headers.putAll(headerParameters))
87+
.body(requestParameters)
88+
.retrieve()
89+
.body(OAuth2AccessTokenResponse.class);
90+
// @formatter:on
9191
} catch (RestClientException ex) {
9292
OAuth2Error oauth2Error = new OAuth2Error("invalid_token_response",
9393
"An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response: "

samples/demo-client/src/main/java/sample/config/RestTemplateConfig.java renamed to samples/demo-client/src/main/java/sample/config/RestClientConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2024 the original author or authors.
2+
* Copyright 2020-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -41,7 +41,7 @@
4141
* @since 1.3
4242
*/
4343
@Configuration(proxyBeanMethods = false)
44-
public class RestTemplateConfig {
44+
public class RestClientConfig {
4545

4646
@Bean("default-client-http-request-factory")
4747
Supplier<ClientHttpRequestFactory> defaultClientHttpRequestFactory(SslBundles sslBundles) {

samples/demo-client/src/main/java/sample/config/WebClientConfig.java

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2024 the original author or authors.
2+
* Copyright 2020-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,7 +15,6 @@
1515
*/
1616
package sample.config;
1717

18-
import java.util.Arrays;
1918
import java.util.function.Supplier;
2019

2120
import javax.net.ssl.KeyManagerFactory;
@@ -30,7 +29,6 @@
3029
import org.springframework.beans.factory.annotation.Qualifier;
3130
import org.springframework.boot.ssl.SslBundle;
3231
import org.springframework.boot.ssl.SslBundles;
33-
import org.springframework.boot.web.client.RestTemplateBuilder;
3432
import org.springframework.context.annotation.Bean;
3533
import org.springframework.context.annotation.Configuration;
3634
import org.springframework.http.client.ClientHttpRequestFactory;
@@ -40,10 +38,9 @@
4038
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
4139
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
4240
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder;
43-
import org.springframework.security.oauth2.client.endpoint.DefaultClientCredentialsTokenResponseClient;
4441
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
4542
import org.springframework.security.oauth2.client.endpoint.OAuth2ClientCredentialsGrantRequest;
46-
import org.springframework.security.oauth2.client.endpoint.OAuth2ClientCredentialsGrantRequestEntityConverter;
43+
import org.springframework.security.oauth2.client.endpoint.RestClientClientCredentialsTokenResponseClient;
4744
import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler;
4845
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
4946
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
@@ -53,7 +50,7 @@
5350
import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter;
5451
import org.springframework.util.LinkedMultiValueMap;
5552
import org.springframework.util.MultiValueMap;
56-
import org.springframework.web.client.RestTemplate;
53+
import org.springframework.web.client.RestClient;
5754
import org.springframework.web.reactive.function.client.WebClient;
5855

5956
/**
@@ -83,17 +80,18 @@ public WebClient defaultClientWebClient(
8380
public WebClient selfSignedDemoClientWebClient(
8481
ClientRegistrationRepository clientRegistrationRepository,
8582
OAuth2AuthorizedClientRepository authorizedClientRepository,
86-
RestTemplateBuilder restTemplateBuilder,
8783
@Qualifier("self-signed-demo-client-http-request-factory") Supplier<ClientHttpRequestFactory> clientHttpRequestFactory,
8884
SslBundles sslBundles) throws Exception {
8985

9086
// @formatter:off
91-
RestTemplate restTemplate = restTemplateBuilder
92-
.requestFactory(clientHttpRequestFactory)
93-
.messageConverters(Arrays.asList(
94-
new FormHttpMessageConverter(),
95-
new OAuth2AccessTokenResponseHttpMessageConverter()))
96-
.errorHandler(new OAuth2ErrorResponseErrorHandler())
87+
RestClient restClient = RestClient.builder()
88+
.requestFactory(clientHttpRequestFactory.get())
89+
.messageConverters((messageConverters) -> {
90+
messageConverters.clear();
91+
messageConverters.add(new FormHttpMessageConverter());
92+
messageConverters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
93+
})
94+
.defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
9795
.build();
9896
// @formatter:on
9997

@@ -102,7 +100,7 @@ public WebClient selfSignedDemoClientWebClient(
102100
OAuth2AuthorizedClientProviderBuilder.builder()
103101
.clientCredentials(clientCredentials ->
104102
clientCredentials.accessTokenResponseClient(
105-
createClientCredentialsTokenResponseClient(restTemplate)))
103+
createClientCredentialsTokenResponseClient(restClient)))
106104
.build();
107105
// @formatter:on
108106

@@ -124,16 +122,17 @@ public WebClient selfSignedDemoClientWebClient(
124122
public OAuth2AuthorizedClientManager authorizedClientManager(
125123
ClientRegistrationRepository clientRegistrationRepository,
126124
OAuth2AuthorizedClientRepository authorizedClientRepository,
127-
RestTemplateBuilder restTemplateBuilder,
128125
@Qualifier("default-client-http-request-factory") Supplier<ClientHttpRequestFactory> clientHttpRequestFactory) {
129126

130127
// @formatter:off
131-
RestTemplate restTemplate = restTemplateBuilder
132-
.requestFactory(clientHttpRequestFactory)
133-
.messageConverters(Arrays.asList(
134-
new FormHttpMessageConverter(),
135-
new OAuth2AccessTokenResponseHttpMessageConverter()))
136-
.errorHandler(new OAuth2ErrorResponseErrorHandler())
128+
RestClient restClient = RestClient.builder()
129+
.requestFactory(clientHttpRequestFactory.get())
130+
.messageConverters((messageConverters) -> {
131+
messageConverters.clear();
132+
messageConverters.add(new FormHttpMessageConverter());
133+
messageConverters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
134+
})
135+
.defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
137136
.build();
138137
// @formatter:on
139138

@@ -144,7 +143,7 @@ public OAuth2AuthorizedClientManager authorizedClientManager(
144143
.refreshToken()
145144
.clientCredentials(clientCredentials ->
146145
clientCredentials.accessTokenResponseClient(
147-
createClientCredentialsTokenResponseClient(restTemplate)))
146+
createClientCredentialsTokenResponseClient(restClient)))
148147
.provider(new DeviceCodeOAuth2AuthorizedClientProvider())
149148
.build();
150149
// @formatter:on
@@ -177,20 +176,16 @@ private static ClientHttpConnector createClientConnector(SslBundle sslBundle) th
177176
}
178177

179178
private static OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> createClientCredentialsTokenResponseClient(
180-
RestTemplate restTemplate) {
181-
DefaultClientCredentialsTokenResponseClient clientCredentialsTokenResponseClient =
182-
new DefaultClientCredentialsTokenResponseClient();
183-
clientCredentialsTokenResponseClient.setRestOperations(restTemplate);
184-
185-
OAuth2ClientCredentialsGrantRequestEntityConverter clientCredentialsGrantRequestEntityConverter =
186-
new OAuth2ClientCredentialsGrantRequestEntityConverter();
187-
clientCredentialsGrantRequestEntityConverter.addParametersConverter(authorizationGrantRequest -> {
179+
RestClient restClient) {
180+
RestClientClientCredentialsTokenResponseClient clientCredentialsTokenResponseClient =
181+
new RestClientClientCredentialsTokenResponseClient();
182+
clientCredentialsTokenResponseClient.addParametersConverter(authorizationGrantRequest -> {
188183
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
189184
// client_id parameter is required for tls_client_auth method
190185
parameters.add(OAuth2ParameterNames.CLIENT_ID, authorizationGrantRequest.getClientRegistration().getClientId());
191186
return parameters;
192187
});
193-
clientCredentialsTokenResponseClient.setRequestEntityConverter(clientCredentialsGrantRequestEntityConverter);
188+
clientCredentialsTokenResponseClient.setRestClient(restClient);
194189

195190
return clientCredentialsTokenResponseClient;
196191
}

samples/messages-resource/src/main/java/sample/config/TomcatServerConfig.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2024 the original author or authors.
2+
* Copyright 2020-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
1717

1818
import org.apache.catalina.connector.Connector;
1919

20-
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
20+
import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory;
2121
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
2222
import org.springframework.context.annotation.Bean;
2323
import org.springframework.context.annotation.Configuration;
@@ -31,7 +31,7 @@ public class TomcatServerConfig {
3131

3232
@Bean
3333
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> connectorCustomizer() {
34-
return (tomcat) -> tomcat.addAdditionalTomcatConnectors(createHttpConnector());
34+
return (tomcat) -> tomcat.addAdditionalConnectors(createHttpConnector());
3535
}
3636

3737
private Connector createHttpConnector() {

0 commit comments

Comments
 (0)