Skip to content

Commit 30cdc0d

Browse files
committed
[ISSUE #14466] Migrate client HTTP JSON parsing
Replace Jackson TypeReference based HTTP response parsing with neutral JsonUtils and NacosTypeReference in client HTTP proxies. Add AgentSpec HTTP proxy coverage and update the Jackson adapter migration tracker. Assisted-by: Claude Code
1 parent 0028ad6 commit 30cdc0d

4 files changed

Lines changed: 67 additions & 18 deletions

File tree

client/src/main/java/com/alibaba/nacos/client/ai/remote/AiHttpClientProxy.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import com.alibaba.nacos.api.ai.model.skills.SkillUtils;
2222
import com.alibaba.nacos.api.exception.NacosException;
2323
import com.alibaba.nacos.api.model.v2.Result;
24+
import com.alibaba.nacos.api.utils.json.JsonUtils;
25+
import com.alibaba.nacos.api.utils.json.NacosTypeReference;
2426
import com.alibaba.nacos.client.env.NacosClientProperties;
2527
import com.alibaba.nacos.client.naming.core.NamingServerListManager;
2628
import com.alibaba.nacos.client.naming.remote.http.NamingHttpClientManager;
@@ -32,11 +34,9 @@
3234
import com.alibaba.nacos.common.http.param.Header;
3335
import com.alibaba.nacos.common.http.param.Query;
3436
import com.alibaba.nacos.common.tls.TlsSystemConfig;
35-
import com.alibaba.nacos.common.utils.JacksonUtils;
3637
import com.alibaba.nacos.common.utils.StringUtils;
3738
import com.alibaba.nacos.common.utils.ThreadUtils;
3839
import com.alibaba.nacos.plugin.auth.api.RequestResource;
39-
import com.fasterxml.jackson.core.type.TypeReference;
4040
import org.slf4j.Logger;
4141
import org.slf4j.LoggerFactory;
4242

@@ -134,7 +134,7 @@ public Prompt queryPrompt(String promptKey, String version, String label, String
134134

135135
String responseBody = reqApi(PROMPT_CLIENT_PATH, params, resource);
136136
Result<Prompt> result =
137-
JacksonUtils.toObj(responseBody, new TypeReference<Result<Prompt>>() {
137+
JsonUtils.toObj(responseBody, new NacosTypeReference<Result<Prompt>>() {
138138
});
139139
return result.getData();
140140
}
@@ -237,7 +237,7 @@ public AgentSpecQueryResponse queryAgentSpec(String agentSpecName, String versio
237237
AGENTSPEC_CLIENT_PATH, params, resource);
238238
String responseBody = restResult.getData();
239239
Result<AgentSpec> result =
240-
JacksonUtils.toObj(responseBody, new TypeReference<Result<AgentSpec>>() {
240+
JsonUtils.toObj(responseBody, new NacosTypeReference<Result<AgentSpec>>() {
241241
});
242242
String publishedMd5 = restResult.getHeader().getValue("X-Nacos-AgentSpec-Md5");
243243
String resolvedVersion = restResult.getHeader()

client/src/main/java/com/alibaba/nacos/client/naming/remote/http/NamingHttpClientProxy.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import com.alibaba.nacos.api.selector.AbstractSelector;
2929
import com.alibaba.nacos.api.selector.ExpressionSelector;
3030
import com.alibaba.nacos.api.selector.SelectorType;
31+
import com.alibaba.nacos.api.utils.json.JsonUtils;
32+
import com.alibaba.nacos.api.utils.json.NacosTypeReference;
3133
import com.alibaba.nacos.client.address.ServerListChangeEvent;
3234
import com.alibaba.nacos.client.env.NacosClientProperties;
3335
import com.alibaba.nacos.client.monitor.MetricsMonitor;
@@ -47,8 +49,6 @@
4749
import com.alibaba.nacos.common.utils.InternetAddressUtil;
4850
import com.alibaba.nacos.common.utils.JacksonUtils;
4951
import com.alibaba.nacos.common.utils.StringUtils;
50-
import com.fasterxml.jackson.core.type.TypeReference;
51-
import com.fasterxml.jackson.databind.JsonNode;
5252
import org.apache.hc.core5.http.HttpStatus;
5353

5454
import java.util.Collections;
@@ -232,7 +232,7 @@ public Service queryService(String serviceName, String groupName) throws NacosEx
232232
params.put(CommonParams.GROUP_NAME, groupName);
233233

234234
String result = reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.GET);
235-
return JacksonUtils.toObj(result, Service.class);
235+
return JsonUtils.toObj(result, Service.class);
236236
}
237237

238238
@Override
@@ -287,9 +287,11 @@ public boolean serverHealthy() {
287287
try {
288288
String result = reqApi(UtilAndComs.webContext + "/v3/admin/core/state/liveness",
289289
new HashMap<>(8), HttpMethod.GET);
290-
JsonNode json = JacksonUtils.toObj(result);
291-
int statusCode = json.get("code").asInt();
292-
return 0 == statusCode;
290+
Map<String, Object> json =
291+
JsonUtils.toObj(result, new NacosTypeReference<Map<String, Object>>() {
292+
});
293+
Object statusCode = json.get("code");
294+
return statusCode instanceof Number && 0 == ((Number) statusCode).intValue();
293295
} catch (Exception e) {
294296
return false;
295297
}
@@ -321,11 +323,14 @@ public ListView<String> getServiceList(int pageNo, int pageSize, String groupNam
321323

322324
String result = reqApi(UtilAndComs.nacosUrlBase + "/service/list", params, HttpMethod.GET);
323325

324-
JsonNode json = JacksonUtils.toObj(result);
326+
Map<String, Object> json =
327+
JsonUtils.toObj(result, new NacosTypeReference<Map<String, Object>>() {
328+
});
325329
ListView<String> listView = new ListView<>();
326-
listView.setCount(json.get("count").asInt());
327-
listView.setData(
328-
JacksonUtils.toObj(json.get("doms").toString(), new TypeReference<List<String>>() {
330+
Object count = json.get("count");
331+
listView.setCount(count instanceof Number ? ((Number) count).intValue() : 0);
332+
listView.setData(JsonUtils.toObj(JsonUtils.toJson(json.get("doms")),
333+
new NacosTypeReference<List<String>>() {
329334
}));
330335

331336
return listView;

client/src/test/java/com/alibaba/nacos/client/ai/remote/AiHttpClientProxyTest.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@
1616

1717
package com.alibaba.nacos.client.ai.remote;
1818

19+
import com.alibaba.nacos.api.ai.model.agentspecs.AgentSpec;
1920
import com.alibaba.nacos.api.ai.model.prompt.Prompt;
2021
import com.alibaba.nacos.api.exception.NacosException;
22+
import com.alibaba.nacos.api.model.v2.Result;
2123
import com.alibaba.nacos.client.naming.core.NamingServerListManager;
2224
import com.alibaba.nacos.client.security.SecurityProxy;
2325
import com.alibaba.nacos.common.http.HttpRestResult;
2426
import com.alibaba.nacos.common.http.client.NacosRestTemplate;
2527
import com.alibaba.nacos.common.http.param.Header;
2628
import com.alibaba.nacos.common.http.param.Query;
2729
import com.alibaba.nacos.common.utils.JacksonUtils;
28-
import com.alibaba.nacos.api.model.v2.Result;
2930
import org.junit.jupiter.api.AfterEach;
3031
import org.junit.jupiter.api.BeforeEach;
3132
import org.junit.jupiter.api.Test;
@@ -191,6 +192,37 @@ void queryPromptWithNullKeyUsesEmptyResource() throws Exception {
191192
assertNotNull(actual);
192193
}
193194

195+
@Test
196+
void queryAgentSpecSuccess() throws Exception {
197+
AgentSpec expectedAgentSpec = new AgentSpec();
198+
expectedAgentSpec.setName("agent-a");
199+
expectedAgentSpec.setNamespaceId("public");
200+
expectedAgentSpec.setDescription("test agent");
201+
Result<AgentSpec> result = Result.success(expectedAgentSpec);
202+
203+
HttpRestResult<String> httpResult = new HttpRestResult<>();
204+
httpResult.setCode(200);
205+
httpResult.setData(JacksonUtils.toJson(result));
206+
httpResult.setHeader(Header.newInstance().addParam("X-Nacos-AgentSpec-Md5", "md5-value")
207+
.addParam("X-Nacos-AgentSpec-Resolved-Version", "1.0.0"));
208+
209+
when(serverListManager.getServerList()).thenReturn(Arrays.asList("127.0.0.1:8848"));
210+
when(serverListManager.getContextPath()).thenReturn("/nacos");
211+
when(securityProxy.getIdentityContext(any())).thenReturn(new HashMap<>());
212+
doReturn(httpResult).when(nacosRestTemplate).get(anyString(), any(Header.class),
213+
any(Query.class), eq(String.class));
214+
215+
AgentSpecQueryResponse actual =
216+
httpClientProxy.queryAgentSpec("agent-a", "1.0.0", null, null);
217+
218+
assertNotNull(actual);
219+
assertEquals("agent-a", actual.getAgentSpec().getName());
220+
assertEquals("public", actual.getAgentSpec().getNamespaceId());
221+
assertEquals("test agent", actual.getAgentSpec().getDescription());
222+
assertEquals("md5-value", actual.getMd5());
223+
assertEquals("1.0.0", actual.getResolvedVersion());
224+
}
225+
194226
@Test
195227
void queryPromptForbiddenTriggersReLogin() throws Exception {
196228
HttpRestResult<String> httpResult = new HttpRestResult<>();

docs/jackson-json-adapter-migration-todo.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,17 @@ Last updated: 2026-06-16.
8181
- `common/target/site/jacoco/jacoco.csv`: `AbstractNacosRestTemplate` has
8282
`LINE_MISSED=0`.
8383
- `mvn -pl common apache-rat:check`
84+
- 2026-06-17, stage 7 client HTTP response JSON cleanup:
85+
- `mvn -pl client spotless:apply`
86+
- `mvn -pl client spotless:check`
87+
- `mvn -pl client -am -Dtest=NamingHttpClientProxyTest,AiHttpClientProxyTest -Dsurefire.failIfNoSpecifiedTests=false test`
88+
- `client/target/site/jacoco/jacoco.xml`: changed response parsing lines in
89+
`NamingHttpClientProxy` and `AiHttpClientProxy` have covered instructions;
90+
the classes still have pre-existing uncovered legacy branches.
91+
- `rg "com\\.fasterxml\\.jackson\\.core\\.type\\.TypeReference|com\\.fasterxml\\.jackson\\.databind\\.JsonNode|new TypeReference|JsonNode" client/src/main/java/com/alibaba/nacos/client/naming/remote/http/NamingHttpClientProxy.java client/src/main/java/com/alibaba/nacos/client/ai/remote/AiHttpClientProxy.java`
92+
returns no matches.
93+
- `mvn -pl client apache-rat:check`
94+
- `mvn apache-rat:check -DskipTests`
8495

8596
## Implementation Principles
8697

@@ -280,14 +291,15 @@ Last updated: 2026-06-16.
280291
- Validation:
281292
- HTTP response handler selection unit tests.
282293

283-
- `[ ]` Migrate client HTTP response parsing from Jackson `TypeReference`.
294+
- `[x]` Migrate client HTTP response parsing from Jackson `TypeReference`.
284295
- Files:
285296
- `client/src/main/java/com/alibaba/nacos/client/naming/remote/http/NamingHttpClientProxy.java`
286297
- `client/src/main/java/com/alibaba/nacos/client/ai/remote/AiHttpClientProxy.java`
287298
- Plan:
288299
- Replace `TypeReference<T>` with `NacosTypeReference<T>`.
289-
- Replace `JacksonUtils.toObj(...)` with `JsonUtils.toObj(...)`.
290-
- Replace simple `JsonNode` reads with DTOs or `Map<String, Object>`.
300+
- Replace HTTP response `JacksonUtils.toObj(...)` calls with
301+
`JsonUtils.toObj(...)`.
302+
- Replace simple `JsonNode` reads with `Map<String, Object>`.
291303
- Validation:
292304
- Naming HTTP proxy tests.
293305
- AI HTTP proxy tests.

0 commit comments

Comments
 (0)