Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 615c25d

Browse files
committed
Polishing contribution
Closes gh-36126
1 parent 3df6658 commit 615c25d

2 files changed

Lines changed: 34 additions & 86 deletions

File tree

spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBean.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,14 @@ private static final class ConfigurableGroup {
177177

178178
private @Nullable Object clientBuilder;
179179

180-
private final @Nullable StringValueResolver embeddedValueResolver;
181-
182180
private final HttpServiceProxyFactory.Builder proxyFactoryBuilder = HttpServiceProxyFactory.builder();
183181

184-
ConfigurableGroup(HttpServiceGroup group, @Nullable StringValueResolver embeddedValueResolver) {
182+
ConfigurableGroup(HttpServiceGroup group, @Nullable StringValueResolver valueResolver) {
185183
this.group = group;
186184
this.groupAdapter = getGroupAdapter(group.clientType());
187-
this.embeddedValueResolver = embeddedValueResolver;
185+
if (valueResolver != null) {
186+
this.proxyFactoryBuilder.embeddedValueResolver(valueResolver);
187+
}
188188
}
189189

190190
private static HttpServiceGroupAdapter<?> getGroupAdapter(HttpServiceGroup.ClientType clientType) {
@@ -229,9 +229,6 @@ private <CB> CB getClientBuilder() {
229229
public Map<Class<?>, Object> createProxies() {
230230
Map<Class<?>, Object> map = new LinkedHashMap<>(this.group.httpServiceTypes().size());
231231
HttpExchangeAdapter adapter = this.groupAdapter.createExchangeAdapter(getClientBuilder());
232-
if (this.embeddedValueResolver != null) {
233-
this.proxyFactoryBuilder.embeddedValueResolver(this.embeddedValueResolver);
234-
}
235232
HttpServiceProxyFactory factory = this.proxyFactoryBuilder.exchangeAdapter(adapter).build();
236233
this.group.httpServiceTypes().forEach(type -> map.put(type, factory.createClient(type)));
237234
return map;

spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBeanTests.java

Lines changed: 30 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.List;
2121
import java.util.function.Predicate;
2222

23+
import org.jspecify.annotations.Nullable;
2324
import org.junit.jupiter.api.Test;
2425
import org.mockito.ArgumentCaptor;
2526
import org.mockito.Mockito;
@@ -42,7 +43,6 @@
4243
import org.springframework.web.testfixture.http.client.MockClientHttpResponse;
4344

4445
import static org.assertj.core.api.Assertions.assertThat;
45-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
4646
import static org.mockito.ArgumentMatchers.any;
4747
import static org.mockito.BDDMockito.given;
4848
import static org.mockito.Mockito.atLeastOnce;
@@ -59,19 +59,20 @@ public class HttpServiceProxyRegistryFactoryBeanTests {
5959
void twoGroups() {
6060
String echoName = "echo";
6161
String greetingName = "greeting";
62-
GroupsMetadata groupsMetadata = new GroupsMetadata();
62+
GroupsMetadata metadata = new GroupsMetadata();
6363

6464
List<String> echoServices = List.of(EchoA.class.getName(), EchoB.class.getName());
65-
groupsMetadata.getOrCreateGroup(echoName, REST_CLIENT).httpServiceTypeNames().addAll(echoServices);
65+
metadata.getOrCreateGroup(echoName, REST_CLIENT).httpServiceTypeNames().addAll(echoServices);
6666

6767
List<String> greetingServices = List.of(GreetingA.class.getName(), GreetingB.class.getName());
68-
groupsMetadata.getOrCreateGroup(greetingName, REST_CLIENT).httpServiceTypeNames().addAll(greetingServices);
68+
metadata.getOrCreateGroup(greetingName, REST_CLIENT).httpServiceTypeNames().addAll(greetingServices);
6969

7070
Predicate<HttpServiceGroup> echoFilter = group -> group.name().equals(echoName);
7171
Predicate<HttpServiceGroup> greetingFilter = group -> group.name().equals(greetingName);
7272
TestConfigurer groupConfigurer = new TestConfigurer(List.of(echoFilter, greetingFilter));
7373

74-
HttpServiceProxyRegistry registry = initProxyRegistry(groupConfigurer, groupsMetadata);
74+
HttpServiceProxyRegistry registry = initProxyRegistry(groupConfigurer, metadata, null);
75+
7576
assertThat(registry.getGroupNames()).containsExactlyInAnyOrder(echoName, greetingName);
7677
assertThat(registry.getClientTypesInGroup(echoName)).containsExactlyInAnyOrder(EchoA.class, EchoB.class);
7778
assertThat(registry.getClientTypesInGroup(greetingName)).containsExactlyInAnyOrder(GreetingA.class, GreetingB.class);
@@ -84,9 +85,6 @@ void twoGroups() {
8485

8586
@Test
8687
void initializeClientBuilder() throws Exception {
87-
GroupsMetadata groupsMetadata = new GroupsMetadata();
88-
groupsMetadata.getOrCreateGroup("echo", REST_CLIENT).httpServiceTypeNames().add(EchoA.class.getName());
89-
9088
ClientHttpRequestFactory requestFactory = Mockito.mock(ClientHttpRequestFactory.class);
9189
MockClientHttpRequest request = new MockClientHttpRequest();
9290
request.setResponse(new MockClientHttpResponse());
@@ -95,95 +93,47 @@ void initializeClientBuilder() throws Exception {
9593
RestClient.Builder clientBuilder = RestClient.builder().baseUrl("/").requestFactory(requestFactory);
9694
RestClientHttpServiceGroupConfigurer groupConfigurer = groups -> groups.forEachClient(group -> clientBuilder);
9795

98-
HttpServiceProxyRegistry registry = initProxyRegistry(groupConfigurer, groupsMetadata);
96+
GroupsMetadata metadata = new GroupsMetadata();
97+
metadata.getOrCreateGroup("echo", REST_CLIENT).httpServiceTypeNames().add(EchoA.class.getName());
98+
99+
HttpServiceProxyRegistry registry = initProxyRegistry(groupConfigurer, metadata, null);
99100
registry.getClient(EchoA.class).handle("foo");
100101

101102
verify(requestFactory, atLeastOnce()).createRequest(any(), any());
102103
}
103104

104105
@Test
105-
void propertyPlaceholderInHttpExchangeUrlIsResolved() throws Exception {
106-
GroupsMetadata groupsMetadata = new GroupsMetadata();
107-
groupsMetadata.getOrCreateGroup("testGroup", REST_CLIENT)
108-
.httpServiceTypeNames()
109-
.add(PlaceholderService.class.getName());
106+
void propertyPlaceholder() throws Exception {
107+
GroupsMetadata metadata = new GroupsMetadata();
108+
metadata.getOrCreateGroup("group", REST_CLIENT).httpServiceTypeNames().add(PlaceholderService.class.getName());
110109

111110
ClientHttpRequestFactory requestFactory = Mockito.mock(ClientHttpRequestFactory.class);
112-
MockClientHttpRequest mockRequest = new MockClientHttpRequest();
113-
mockRequest.setResponse(new MockClientHttpResponse());
111+
MockClientHttpRequest request = new MockClientHttpRequest();
112+
request.setResponse(new MockClientHttpResponse());
114113

115114
ArgumentCaptor<URI> uriCaptor = ArgumentCaptor.forClass(URI.class);
116-
given(requestFactory.createRequest(uriCaptor.capture(), any())).willReturn(mockRequest);
117-
118-
StringValueResolver resolver = value -> {
119-
if (value.contains("${test.base.url}")) {
120-
return value.replace("${test.base.url}", "https://api.example.com");
121-
}
122-
return value;
123-
};
115+
given(requestFactory.createRequest(uriCaptor.capture(), any())).willReturn(request);
124116

125117
RestClient.Builder clientBuilder = RestClient.builder().requestFactory(requestFactory);
126-
127118
RestClientHttpServiceGroupConfigurer configurer = groups -> groups.forEachClient(group -> clientBuilder);
128119

129-
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
130-
context.registerBean(RestClientHttpServiceGroupConfigurer.class, () -> configurer);
131-
context.refresh();
132-
133-
HttpServiceProxyRegistryFactoryBean factoryBean = new HttpServiceProxyRegistryFactoryBean(groupsMetadata);
134-
135-
factoryBean.setApplicationContext(context);
136-
factoryBean.setBeanClassLoader(getClass().getClassLoader());
137-
factoryBean.setEmbeddedValueResolver(resolver);
138-
factoryBean.afterPropertiesSet();
139-
140-
HttpServiceProxyRegistry registry = factoryBean.getObject();
141-
PlaceholderService service = registry.getClient(PlaceholderService.class);
142-
service.callEndpoint();
143-
144-
URI requestedUri = uriCaptor.getValue();
145-
146-
assertThat(requestedUri.toString())
147-
.startsWith("https://api.example.com")
148-
.doesNotContain("${")
149-
.contains("/endpoint");
150-
}
151-
152-
@Test
153-
void withoutResolverPlaceholderRemainsUnresolved() throws Exception {
154-
GroupsMetadata groupsMetadata = new GroupsMetadata();
155-
groupsMetadata.getOrCreateGroup("testGroup", REST_CLIENT)
156-
.httpServiceTypeNames()
157-
.add(PlaceholderService.class.getName());
158-
159-
ClientHttpRequestFactory requestFactory = Mockito.mock(ClientHttpRequestFactory.class);
160-
MockClientHttpRequest capturedRequest = new MockClientHttpRequest();
161-
capturedRequest.setResponse(new MockClientHttpResponse());
162-
given(requestFactory.createRequest(any(), any())).willReturn(capturedRequest);
163-
164-
RestClient.Builder clientBuilder = RestClient.builder().requestFactory(requestFactory);
165-
RestClientHttpServiceGroupConfigurer configurer = groups ->
166-
groups.forEachClient(group -> clientBuilder);
167-
168-
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
169-
context.registerBean(RestClientHttpServiceGroupConfigurer.class, () -> configurer);
170-
context.refresh();
171-
172-
HttpServiceProxyRegistryFactoryBean factoryBean = new HttpServiceProxyRegistryFactoryBean(groupsMetadata);
173-
factoryBean.setApplicationContext(context);
174-
factoryBean.setBeanClassLoader(getClass().getClassLoader());
175-
factoryBean.afterPropertiesSet();
120+
String baseUrl = "https://api.example.com";
121+
HttpServiceProxyRegistry registry = initProxyRegistry(configurer, metadata, value -> {
122+
if (value.contains("${test.base.url}")) {
123+
return value.replace("${test.base.url}", baseUrl);
124+
}
125+
return value;
126+
});
176127

177-
HttpServiceProxyRegistry registry = factoryBean.getObject();
178128
PlaceholderService service = registry.getClient(PlaceholderService.class);
129+
service.invoke();
179130

180-
assertThatThrownBy(service::callEndpoint)
181-
.isInstanceOf(IllegalArgumentException.class)
182-
.hasMessageContaining("test.base.url");
131+
assertThat(uriCaptor.getValue().toString()).isEqualTo(baseUrl);
183132
}
184133

185134
private HttpServiceProxyRegistry initProxyRegistry(
186-
RestClientHttpServiceGroupConfigurer groupConfigurer, GroupsMetadata groupsMetadata) {
135+
RestClientHttpServiceGroupConfigurer groupConfigurer, GroupsMetadata groupsMetadata,
136+
@Nullable StringValueResolver valueResolver) {
187137

188138
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
189139
context.registerBean(RestClientHttpServiceGroupConfigurer.class, () -> groupConfigurer);
@@ -192,6 +142,7 @@ private HttpServiceProxyRegistry initProxyRegistry(
192142
HttpServiceProxyRegistryFactoryBean factoryBean = new HttpServiceProxyRegistryFactoryBean(groupsMetadata);
193143
factoryBean.setApplicationContext(context);
194144
factoryBean.setBeanClassLoader(getClass().getClassLoader());
145+
factoryBean.setEmbeddedValueResolver(valueResolver);
195146
factoryBean.afterPropertiesSet();
196147

197148
return factoryBean.getObject();
@@ -226,7 +177,7 @@ public void withGroup(HttpServiceGroup group, RestClient clientBuilder, HttpServ
226177
@HttpExchange(url = "${test.base.url}")
227178
interface PlaceholderService {
228179

229-
@GetExchange("/endpoint")
230-
String callEndpoint();
180+
@GetExchange
181+
String invoke();
231182
}
232183
}

0 commit comments

Comments
 (0)