Compatibility updates for framework 6 and boot 3
This commit is contained in:
@@ -108,7 +108,7 @@
|
||||
<artifactId>spring-boot-starter-hateoas</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<!--<dependency>
|
||||
<groupId>org.springframework.security.oauth.boot</groupId>
|
||||
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
|
||||
<optional>true</optional>
|
||||
@@ -126,7 +126,7 @@
|
||||
<artifactId>javax.activation-api</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
</dependency>-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-aop</artifactId>
|
||||
|
||||
@@ -20,8 +20,7 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.cloud.client.DefaultServiceInstance;
|
||||
import org.springframework.cloud.client.discovery.DiscoveryClient;
|
||||
@@ -40,7 +39,7 @@ import org.springframework.cloud.client.discovery.DiscoveryClient;
|
||||
*/
|
||||
|
||||
@ConfigurationProperties(prefix = "spring.cloud.discovery.client.simple")
|
||||
public class SimpleDiscoveryProperties {
|
||||
public class SimpleDiscoveryProperties implements InitializingBean {
|
||||
|
||||
private Map<String, List<DefaultServiceInstance>> instances = new HashMap<>();
|
||||
|
||||
@@ -73,8 +72,8 @@ public class SimpleDiscoveryProperties {
|
||||
this.order = order;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
for (String key : this.instances.keySet()) {
|
||||
for (DefaultServiceInstance instance : this.instances.get(key)) {
|
||||
instance.setServiceId(key);
|
||||
|
||||
@@ -20,10 +20,9 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.cloud.client.DefaultServiceInstance;
|
||||
import org.springframework.cloud.client.ServiceInstance;
|
||||
@@ -43,7 +42,7 @@ import static java.util.Collections.emptyList;
|
||||
* @since 2.2.0
|
||||
*/
|
||||
@ConfigurationProperties(prefix = "spring.cloud.discovery.client.simple")
|
||||
public class SimpleReactiveDiscoveryProperties {
|
||||
public class SimpleReactiveDiscoveryProperties implements InitializingBean {
|
||||
|
||||
private Map<String, List<DefaultServiceInstance>> instances = new HashMap<>();
|
||||
|
||||
@@ -80,8 +79,8 @@ public class SimpleReactiveDiscoveryProperties {
|
||||
this.order = order;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
for (String key : this.instances.keySet()) {
|
||||
for (DefaultServiceInstance instance : this.instances.get(key)) {
|
||||
instance.setServiceId(key);
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.client.loadbalancer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.SmartInitializingSingleton;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.client.AsyncClientHttpRequestInterceptor;
|
||||
import org.springframework.web.client.AsyncRestTemplate;
|
||||
|
||||
/**
|
||||
* Auto-configuration for blocking client-side load balancing.
|
||||
*
|
||||
* @author Rob Worsnop
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnBean(LoadBalancerClient.class)
|
||||
@ConditionalOnClass(AsyncRestTemplate.class)
|
||||
public class AsyncLoadBalancerAutoConfiguration {
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class AsyncRestTemplateCustomizerConfig {
|
||||
|
||||
@LoadBalanced
|
||||
@Autowired(required = false)
|
||||
private List<AsyncRestTemplate> restTemplates = Collections.emptyList();
|
||||
|
||||
@Bean
|
||||
public SmartInitializingSingleton loadBalancedAsyncRestTemplateInitializer(
|
||||
final List<AsyncRestTemplateCustomizer> customizers) {
|
||||
return () -> {
|
||||
for (AsyncRestTemplate restTemplate : AsyncRestTemplateCustomizerConfig.this.restTemplates) {
|
||||
for (AsyncRestTemplateCustomizer customizer : customizers) {
|
||||
customizer.customize(restTemplate);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class LoadBalancerInterceptorConfig {
|
||||
|
||||
@Bean
|
||||
public AsyncLoadBalancerInterceptor asyncLoadBalancerInterceptor(LoadBalancerClient loadBalancerClient) {
|
||||
return new AsyncLoadBalancerInterceptor(loadBalancerClient);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public AsyncRestTemplateCustomizer asyncRestTemplateCustomizer(
|
||||
final AsyncLoadBalancerInterceptor loadBalancerInterceptor) {
|
||||
return restTemplate -> {
|
||||
List<AsyncClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());
|
||||
list.add(loadBalancerInterceptor);
|
||||
restTemplate.setInterceptors(list);
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.client.loadbalancer;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
|
||||
import org.springframework.http.HttpRequest;
|
||||
import org.springframework.http.client.AsyncClientHttpRequestExecution;
|
||||
import org.springframework.http.client.AsyncClientHttpRequestInterceptor;
|
||||
import org.springframework.http.client.ClientHttpResponse;
|
||||
import org.springframework.util.concurrent.ListenableFuture;
|
||||
|
||||
/**
|
||||
* @author Rob Worsnop
|
||||
*/
|
||||
public class AsyncLoadBalancerInterceptor implements AsyncClientHttpRequestInterceptor {
|
||||
|
||||
private LoadBalancerClient loadBalancer;
|
||||
|
||||
public AsyncLoadBalancerInterceptor(LoadBalancerClient loadBalancer) {
|
||||
this.loadBalancer = loadBalancer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenableFuture<ClientHttpResponse> intercept(final HttpRequest request, final byte[] body,
|
||||
final AsyncClientHttpRequestExecution execution) throws IOException {
|
||||
final URI originalUri = request.getURI();
|
||||
String serviceName = originalUri.getHost();
|
||||
return this.loadBalancer.execute(serviceName, instance -> {
|
||||
HttpRequest serviceRequest = new ServiceRequestWrapper(request, instance,
|
||||
AsyncLoadBalancerInterceptor.this.loadBalancer);
|
||||
return execution.executeAsync(serviceRequest, body);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.client.loadbalancer;
|
||||
|
||||
import org.springframework.web.client.AsyncRestTemplate;
|
||||
|
||||
/**
|
||||
* @author Rob Worsnop
|
||||
*/
|
||||
public interface AsyncRestTemplateCustomizer {
|
||||
|
||||
void customize(AsyncRestTemplate restTemplate);
|
||||
|
||||
}
|
||||
@@ -19,8 +19,7 @@ package org.springframework.cloud.client.serviceregistry;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import javax.annotation.PreDestroy;
|
||||
|
||||
import jakarta.annotation.PreDestroy;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.cloud.client.serviceregistry;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -29,7 +28,7 @@ import org.springframework.context.annotation.Import;
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@Import(AutoServiceRegistrationConfiguration.class)
|
||||
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
|
||||
public class AutoServiceRegistrationAutoConfiguration {
|
||||
public class AutoServiceRegistrationAutoConfiguration implements InitializingBean {
|
||||
|
||||
@Autowired(required = false)
|
||||
private AutoServiceRegistration autoServiceRegistration;
|
||||
@@ -37,8 +36,8 @@ public class AutoServiceRegistrationAutoConfiguration {
|
||||
@Autowired
|
||||
private AutoServiceRegistrationProperties properties;
|
||||
|
||||
@PostConstruct
|
||||
protected void init() {
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
if (this.autoServiceRegistration == null && this.properties.isFailFast()) {
|
||||
throw new IllegalStateException(
|
||||
"Auto Service Registration has " + "been requested, but there is no AutoServiceRegistration bean");
|
||||
|
||||
@@ -22,8 +22,8 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
@@ -40,9 +40,9 @@ import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.oauth2.client.OAuth2ClientContext;
|
||||
import org.springframework.security.oauth2.config.annotation.web.configuration.OAuth2ClientConfiguration;
|
||||
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||
|
||||
/**
|
||||
* Adds an MVC interceptor for relaying OAuth2 access tokens into the client context (if
|
||||
@@ -87,18 +87,13 @@ public class ResourceServerTokenRelayAutoConfiguration {
|
||||
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
registry.addInterceptor(
|
||||
|
||||
new HandlerInterceptorAdapter() {
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
|
||||
Object handler) throws Exception {
|
||||
accessTokenContextRelay.copyToken();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
);
|
||||
registry.addInterceptor(new HandlerInterceptor() {
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
||||
accessTokenContextRelay.copyToken();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class CompatibilityVerifierProperties {
|
||||
* the patch version if you don't want to specify a concrete value. Example:
|
||||
* {@code 3.4.x}
|
||||
*/
|
||||
private List<String> compatibleBootVersions = Arrays.asList("2.6.x");
|
||||
private List<String> compatibleBootVersions = Arrays.asList("3.0.x");
|
||||
|
||||
public boolean isEnabled() {
|
||||
return this.enabled;
|
||||
|
||||
@@ -35,7 +35,7 @@ class SpringBootVersionVerifier implements CompatibilityVerifier {
|
||||
|
||||
final Map<String, CompatibilityPredicate> ACCEPTED_VERSIONS = new HashMap<String, CompatibilityPredicate>() {
|
||||
{
|
||||
this.put("2.6", is2_6());
|
||||
this.put("3.0", is3_0());
|
||||
}
|
||||
};
|
||||
|
||||
@@ -70,24 +70,24 @@ class SpringBootVersionVerifier implements CompatibilityVerifier {
|
||||
return SpringBootVersion.getVersion();
|
||||
}
|
||||
|
||||
CompatibilityPredicate is2_6() {
|
||||
CompatibilityPredicate is3_0() {
|
||||
return new CompatibilityPredicate() {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Predicate for Boot 2.6";
|
||||
return "Predicate for Boot 3.0";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCompatible() {
|
||||
try {
|
||||
// since 2.6
|
||||
Class.forName("org.springframework.boot.autoconfigure.data.redis.ClientResourcesBuilderCustomizer");
|
||||
return true;
|
||||
}
|
||||
catch (ClassNotFoundException e) {
|
||||
return false;
|
||||
}
|
||||
// try {
|
||||
// since 3.0
|
||||
// FIXME: find class or method in boot that is new in 3.0
|
||||
// Class.forName("org.springframework.boot.autoconfigure.data.redis.ClientResourcesBuilderCustomizer");
|
||||
return true;
|
||||
/*
|
||||
* } catch (ClassNotFoundException e) { return false; }
|
||||
*/
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
@@ -139,10 +139,6 @@ public class TlsProperties {
|
||||
return trustStorePassword.toCharArray();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void postConstruct() {
|
||||
}
|
||||
|
||||
private String storeTypeOf(Resource resource) {
|
||||
String extension = fileExtensionOf(resource);
|
||||
String type = EXTENSION_STORE_TYPES.get(extension);
|
||||
|
||||
@@ -7,7 +7,6 @@ org.springframework.cloud.client.discovery.composite.reactive.ReactiveCompositeD
|
||||
org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\
|
||||
org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration,\
|
||||
org.springframework.cloud.client.hypermedia.CloudHypermediaAutoConfiguration,\
|
||||
org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration,\
|
||||
org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration,\
|
||||
org.springframework.cloud.client.loadbalancer.LoadBalancerDefaultMappingsProviderAutoConfiguration,\
|
||||
org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration,\
|
||||
|
||||
@@ -47,7 +47,7 @@ public class SimpleDiscoveryClientTests {
|
||||
DefaultServiceInstance service1Inst2 = new DefaultServiceInstance(null, null, "host2", 8443, true);
|
||||
map.put("service1", Arrays.asList(service1Inst1, service1Inst2));
|
||||
simpleDiscoveryProperties.setInstances(map);
|
||||
simpleDiscoveryProperties.init();
|
||||
simpleDiscoveryProperties.afterPropertiesSet();
|
||||
this.simpleDiscoveryClient = new SimpleDiscoveryClient(simpleDiscoveryProperties);
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ public class SimpleReactiveDiscoveryClientTests {
|
||||
SimpleReactiveDiscoveryProperties simpleReactiveDiscoveryProperties = new SimpleReactiveDiscoveryProperties();
|
||||
simpleReactiveDiscoveryProperties
|
||||
.setInstances(singletonMap("service", Arrays.asList(service1Inst1, service1Inst2)));
|
||||
simpleReactiveDiscoveryProperties.init();
|
||||
simpleReactiveDiscoveryProperties.afterPropertiesSet();
|
||||
this.client = new SimpleReactiveDiscoveryClient(simpleReactiveDiscoveryProperties);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,190 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.client.loadbalancer;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.WebApplicationType;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.cloud.client.DefaultServiceInstance;
|
||||
import org.springframework.cloud.client.ServiceInstance;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.http.client.AsyncClientHttpRequestInterceptor;
|
||||
import org.springframework.web.client.AsyncRestTemplate;
|
||||
|
||||
import static org.assertj.core.api.BDDAssertions.then;
|
||||
import static org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer.REQUEST;
|
||||
|
||||
/**
|
||||
* @author Rob Worsnop
|
||||
* @author Tim Ysewyn
|
||||
* @author Olga Maciaszek-Sharma
|
||||
*/
|
||||
public class AsyncLoadBalancerAutoConfigurationTests {
|
||||
|
||||
@Test
|
||||
public void restTemplateGetsLoadBalancerInterceptor() {
|
||||
ConfigurableApplicationContext context = init(OneRestTemplate.class);
|
||||
final Map<String, AsyncRestTemplate> restTemplates = context.getBeansOfType(AsyncRestTemplate.class);
|
||||
|
||||
then(restTemplates).isNotNull();
|
||||
then(restTemplates.values()).hasSize(1);
|
||||
AsyncRestTemplate restTemplate = restTemplates.values().iterator().next();
|
||||
then(restTemplate).isNotNull();
|
||||
|
||||
assertLoadBalanced(restTemplate);
|
||||
}
|
||||
|
||||
private void assertLoadBalanced(AsyncRestTemplate restTemplate) {
|
||||
List<AsyncClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
|
||||
then(interceptors).hasSize(1);
|
||||
AsyncClientHttpRequestInterceptor interceptor = interceptors.get(0);
|
||||
then(interceptor).isInstanceOf(AsyncLoadBalancerInterceptor.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void multipleRestTemplates() {
|
||||
ConfigurableApplicationContext context = init(TwoRestTemplates.class);
|
||||
final Map<String, AsyncRestTemplate> restTemplates = context.getBeansOfType(AsyncRestTemplate.class);
|
||||
|
||||
then(restTemplates).isNotNull();
|
||||
Collection<AsyncRestTemplate> templates = restTemplates.values();
|
||||
then(templates).hasSize(2);
|
||||
|
||||
TwoRestTemplates.Two two = context.getBean(TwoRestTemplates.Two.class);
|
||||
|
||||
then(two.loadBalanced).isNotNull();
|
||||
assertLoadBalanced(two.loadBalanced);
|
||||
|
||||
then(two.nonLoadBalanced).isNotNull();
|
||||
then(two.nonLoadBalanced.getInterceptors()).isEmpty();
|
||||
}
|
||||
|
||||
protected ConfigurableApplicationContext init(Class<?> config) {
|
||||
return new SpringApplicationBuilder().web(WebApplicationType.NONE)
|
||||
.properties("spring.aop.proxyTargetClass=true")
|
||||
.sources(config, AsyncLoadBalancerAutoConfiguration.class).run();
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
protected static class OneRestTemplate {
|
||||
|
||||
@LoadBalanced
|
||||
@Bean
|
||||
AsyncRestTemplate loadBalancedRestTemplate() {
|
||||
return new AsyncRestTemplate();
|
||||
}
|
||||
|
||||
@Bean
|
||||
LoadBalancerClient loadBalancerClient() {
|
||||
return new NoopLoadBalancerClient();
|
||||
}
|
||||
|
||||
@Bean
|
||||
LoadBalancedRetryFactory loadBalancedRetryFactory() {
|
||||
return new LoadBalancedRetryFactory() {
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
protected static class TwoRestTemplates {
|
||||
|
||||
@Primary
|
||||
@Bean
|
||||
AsyncRestTemplate restTemplate() {
|
||||
return new AsyncRestTemplate();
|
||||
}
|
||||
|
||||
@LoadBalanced
|
||||
@Bean
|
||||
AsyncRestTemplate loadBalancedRestTemplate() {
|
||||
return new AsyncRestTemplate();
|
||||
}
|
||||
|
||||
@Bean
|
||||
LoadBalancerClient loadBalancerClient() {
|
||||
return new NoopLoadBalancerClient();
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
protected static class Two {
|
||||
|
||||
@Autowired
|
||||
AsyncRestTemplate nonLoadBalanced;
|
||||
|
||||
@Autowired
|
||||
@LoadBalanced
|
||||
AsyncRestTemplate loadBalanced;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class NoopLoadBalancerClient implements LoadBalancerClient {
|
||||
|
||||
private final Random random = new Random();
|
||||
|
||||
@Override
|
||||
public ServiceInstance choose(String serviceId) {
|
||||
return choose(serviceId, REQUEST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> ServiceInstance choose(String serviceId, Request<T> request) {
|
||||
return new DefaultServiceInstance(serviceId, serviceId, serviceId, this.random.nextInt(40000), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T execute(String serviceId, LoadBalancerRequest<T> request) {
|
||||
try {
|
||||
return request.apply(choose(serviceId, REQUEST));
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) {
|
||||
try {
|
||||
return request.apply(choose(serviceId, REQUEST));
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public URI reconstructURI(ServiceInstance instance, URI original) {
|
||||
return DefaultServiceInstance.getUri(instance);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -176,8 +176,8 @@ public class SpringBootDependencyTests {
|
||||
@Test
|
||||
public void should_match_against_current_manifest() {
|
||||
try {
|
||||
verifyCurrentVersionFromManifest("2.6");
|
||||
verifyCurrentVersionFromManifest("2.6.x");
|
||||
verifyCurrentVersionFromManifest("3.0");
|
||||
verifyCurrentVersionFromManifest("3.0.x");
|
||||
}
|
||||
catch (AssertionError e) {
|
||||
if (e.getMessage() != null && e.getMessage().contains("2.7.")) {
|
||||
@@ -204,7 +204,7 @@ public class SpringBootDependencyTests {
|
||||
|
||||
@Test
|
||||
public void should_match_against_current_predicate() {
|
||||
List<String> acceptedVersions = Collections.singletonList("2.6");
|
||||
List<String> acceptedVersions = Collections.singletonList("3.0");
|
||||
SpringBootVersionVerifier versionVerifier = new SpringBootVersionVerifier(acceptedVersions) {
|
||||
@Override
|
||||
String getVersionFromManifest() {
|
||||
@@ -212,7 +212,7 @@ public class SpringBootDependencyTests {
|
||||
}
|
||||
};
|
||||
versionVerifier.ACCEPTED_VERSIONS.clear();
|
||||
versionVerifier.ACCEPTED_VERSIONS.put("2.6", versionVerifier.is2_6());
|
||||
versionVerifier.ACCEPTED_VERSIONS.put("3.0", versionVerifier.is3_0());
|
||||
|
||||
VerificationResult verificationResult = versionVerifier.verify();
|
||||
|
||||
@@ -222,7 +222,7 @@ public class SpringBootDependencyTests {
|
||||
|
||||
@Test
|
||||
public void should_match_against_current_predicate_with_version_ending_with_x() {
|
||||
List<String> acceptedVersions = Collections.singletonList("2.6.x");
|
||||
List<String> acceptedVersions = Collections.singletonList("3.0.x");
|
||||
SpringBootVersionVerifier versionVerifier = new SpringBootVersionVerifier(acceptedVersions) {
|
||||
@Override
|
||||
String getVersionFromManifest() {
|
||||
@@ -230,7 +230,7 @@ public class SpringBootDependencyTests {
|
||||
}
|
||||
};
|
||||
versionVerifier.ACCEPTED_VERSIONS.clear();
|
||||
versionVerifier.ACCEPTED_VERSIONS.put("2.6", versionVerifier.is2_6());
|
||||
versionVerifier.ACCEPTED_VERSIONS.put("3.0", versionVerifier.is3_0());
|
||||
|
||||
VerificationResult verificationResult = versionVerifier.verify();
|
||||
|
||||
|
||||
@@ -20,11 +20,10 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.springframework.aop.scope.ScopedProxyUtils;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.ListableBeanFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
@@ -152,13 +151,13 @@ public class RefreshAutoConfiguration {
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(name = "javax.persistence.EntityManagerFactory")
|
||||
protected static class JpaInvokerConfiguration implements LoadTimeWeaverAware {
|
||||
protected static class JpaInvokerConfiguration implements LoadTimeWeaverAware, InitializingBean {
|
||||
|
||||
@Autowired
|
||||
private ListableBeanFactory beanFactory;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
String cls = "org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker";
|
||||
if (this.beanFactory.containsBean(cls)) {
|
||||
this.beanFactory.getBean(cls);
|
||||
|
||||
@@ -20,10 +20,9 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import jakarta.servlet.ServletException;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
|
||||
package org.springframework.cloud.context.properties;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.aopalliance.intercept.MethodInterceptor;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -143,7 +142,7 @@ public class ConfigurationPropertiesRebinderIntegrationTests {
|
||||
}
|
||||
|
||||
@ConfigurationProperties
|
||||
protected static class TestProperties {
|
||||
protected static class TestProperties implements InitializingBean {
|
||||
|
||||
private String message;
|
||||
|
||||
@@ -171,8 +170,8 @@ public class ConfigurationPropertiesRebinderIntegrationTests {
|
||||
this.delay = delay;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
this.count++;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,11 +19,10 @@ package org.springframework.cloud.context.properties;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
@@ -120,7 +119,7 @@ public class ConfigurationPropertiesRebinderListIntegrationTests {
|
||||
}
|
||||
|
||||
@ConfigurationProperties
|
||||
protected static class TestProperties {
|
||||
protected static class TestProperties implements InitializingBean {
|
||||
|
||||
private List<String> messages;
|
||||
|
||||
@@ -138,8 +137,8 @@ public class ConfigurationPropertiesRebinderListIntegrationTests {
|
||||
return this.count;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
this.count++;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,10 +16,9 @@
|
||||
|
||||
package org.springframework.cloud.context.properties;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
@@ -98,7 +97,7 @@ public class ConfigurationPropertiesRebinderRefreshScopeIntegrationTests {
|
||||
}
|
||||
|
||||
@ConfigurationProperties
|
||||
protected static class TestProperties {
|
||||
protected static class TestProperties implements InitializingBean {
|
||||
|
||||
private String message;
|
||||
|
||||
@@ -126,8 +125,8 @@ public class ConfigurationPropertiesRebinderRefreshScopeIntegrationTests {
|
||||
this.delay = delay;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
this.count++;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.support.LiveBeansView;
|
||||
|
||||
import static org.assertj.core.api.BDDAssertions.then;
|
||||
|
||||
@@ -66,10 +65,13 @@ public class RestartIntegrationTests {
|
||||
then(this.context.getParent()).isNotNull();
|
||||
then(this.context.getParent().getParent()).isNull();
|
||||
|
||||
LiveBeansView beans = new LiveBeansView();
|
||||
String json = beans.getSnapshotAsJson();
|
||||
then(json).containsOnlyOnce("parent\": \"bootstrap");
|
||||
then(json).containsOnlyOnce("parent\": null");
|
||||
// FIXME: 4.0.0 missing LiveBeansView
|
||||
/*
|
||||
* LiveBeansView beans = new LiveBeansView(); String json =
|
||||
* beans.getSnapshotAsJson();
|
||||
* then(json).containsOnlyOnce("parent\": \"bootstrap");
|
||||
* then(json).containsOnlyOnce("parent\": null");
|
||||
*/
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<!--<dependency>
|
||||
<groupId>org.springframework.security.oauth.boot</groupId>
|
||||
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
|
||||
<optional>true</optional>
|
||||
@@ -102,7 +102,7 @@
|
||||
<artifactId>javax.activation-api</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
</dependency>-->
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-core</artifactId>
|
||||
|
||||
@@ -23,7 +23,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.cloud.client.ServiceInstance;
|
||||
import org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration;
|
||||
import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory;
|
||||
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
|
||||
import org.springframework.cloud.client.loadbalancer.LoadBalancerClientsProperties;
|
||||
@@ -49,8 +48,7 @@ import org.springframework.web.client.RestTemplate;
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@LoadBalancerClients
|
||||
@AutoConfigureAfter(LoadBalancerAutoConfiguration.class)
|
||||
@AutoConfigureBefore({ org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration.class,
|
||||
AsyncLoadBalancerAutoConfiguration.class })
|
||||
@AutoConfigureBefore({ org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration.class })
|
||||
@ConditionalOnClass(RestTemplate.class)
|
||||
public class BlockingLoadBalancerClientAutoConfiguration {
|
||||
|
||||
|
||||
@@ -16,13 +16,12 @@
|
||||
|
||||
package org.springframework.cloud.loadbalancer.config;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.stoyanr.evictor.ConcurrentMapWithTimedEviction;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
|
||||
@@ -72,12 +71,13 @@ public class LoadBalancerCacheAutoConfiguration {
|
||||
|
||||
}
|
||||
|
||||
static class LoadBalancerCaffeineWarnLogger {
|
||||
static class LoadBalancerCaffeineWarnLogger implements InitializingBean {
|
||||
|
||||
private static final Log LOG = LogFactory.getLog(LoadBalancerCaffeineWarnLogger.class);
|
||||
|
||||
@PostConstruct
|
||||
void logWarning() {
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
if (LOG.isWarnEnabled()) {
|
||||
LOG.warn("Spring Cloud LoadBalancer is currently working with the default cache. "
|
||||
+ "While this cache implementation is useful for development and tests, it's recommended to use Caffeine cache in production."
|
||||
|
||||
Reference in New Issue
Block a user