This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch 2.8.x
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/2.8.x by this push:
     new d960aae46 [#4378]Fix getForObject not properly handle response type 
(#4381)
d960aae46 is described below

commit d960aae46757f137e9c3176ec76e94626ea2e463
Author: liubao68 <[email protected]>
AuthorDate: Tue Jun 25 10:59:02 2024 +0800

    [#4378]Fix getForObject not properly handle response type (#4381)
---
 .../servicecomb/demo/controller/PersonAlias.java   | 35 ++++++++++++++++++++++
 .../microservices/springmvc/controller.yaml        |  9 +++++-
 .../demo/springmvc/client/TestControllerImpl.java  | 12 ++++++++
 .../demo/springmvc/server/ControllerImpl.java      |  7 +++++
 .../springmvc/reference/CseRequestCallback.java    |  8 ++---
 .../springmvc/reference/CseRestTemplate.java       |  7 +++++
 6 files changed, 73 insertions(+), 5 deletions(-)

diff --git 
a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/controller/PersonAlias.java
 
b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/controller/PersonAlias.java
new file mode 100644
index 000000000..a1766eb29
--- /dev/null
+++ 
b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/controller/PersonAlias.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ *     http://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.apache.servicecomb.demo.controller;
+
+public class PersonAlias {
+  private String name;
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return this.name;
+  }
+
+  @Override
+  public String toString() {
+    return name;
+  }
+}
diff --git 
a/demo/demo-schema/src/main/resources/microservices/springmvc/controller.yaml 
b/demo/demo-schema/src/main/resources/microservices/springmvc/controller.yaml
index be2feb0bf..d279bfec7 100644
--- 
a/demo/demo-schema/src/main/resources/microservices/springmvc/controller.yaml
+++ 
b/demo/demo-schema/src/main/resources/microservices/springmvc/controller.yaml
@@ -127,7 +127,14 @@ paths:
           description: check the handler is effective
           schema:
             type: string
-
+  /testResponseModel:
+    get:
+      operationId: testResponseModel
+      responses:
+        "200":
+          description: testResponseModel
+          schema:
+            $ref: '#/definitions/Person'
 definitions:
   Person:
     type: object
diff --git 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestControllerImpl.java
 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestControllerImpl.java
index 37fd873f8..9b4880740 100644
--- 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestControllerImpl.java
+++ 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestControllerImpl.java
@@ -18,6 +18,8 @@ package org.apache.servicecomb.demo.springmvc.client;
 
 import org.apache.servicecomb.demo.CategorizedTestCase;
 import org.apache.servicecomb.demo.TestMgr;
+import org.apache.servicecomb.demo.controller.Person;
+import org.apache.servicecomb.demo.controller.PersonAlias;
 import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
@@ -32,6 +34,16 @@ public class TestControllerImpl implements 
CategorizedTestCase {
 
   public void testRestTransport() throws Exception {
     testQueryParamSpecial();
+    testResponseModel();
+  }
+
+  private void testResponseModel() {
+    Person person = restTemplate.getForObject(SERVER + 
"/springmvc/controller/testResponseModel", Person.class);
+    TestMgr.check("jack", person.getName());
+
+    PersonAlias personAlias = restTemplate.getForObject(SERVER + 
"/springmvc/controller/testResponseModel",
+        PersonAlias.class);
+    TestMgr.check("jack", personAlias.getName());
   }
 
   private void testQueryParamSpecial() {
diff --git 
a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ControllerImpl.java
 
b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ControllerImpl.java
index f3a65fb18..ff1c6514e 100644
--- 
a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ControllerImpl.java
+++ 
b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ControllerImpl.java
@@ -83,4 +83,11 @@ public class ControllerImpl {
   public String sayHello1(@RequestParam("name") String name) {
     return "Hello " + name + "," + 
ContextUtils.getInvocationContext().getContext("k");
   }
+
+  @RequestMapping(path = "/testResponseModel", method = RequestMethod.GET)
+  public Person testResponseModel() {
+    Person person = new Person();
+    person.setName("jack");
+    return person;
+  }
 }
diff --git 
a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRequestCallback.java
 
b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRequestCallback.java
index e452b0e4b..fd1e33cb9 100644
--- 
a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRequestCallback.java
+++ 
b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRequestCallback.java
@@ -26,13 +26,13 @@ import org.springframework.web.client.RequestCallback;
 public class CseRequestCallback implements RequestCallback {
   private final Object requestBody;
 
-  private final RequestCallback orgCallback;
+  private final RequestCallback targetCallback;
 
   private final Type responseType;
 
-  public CseRequestCallback(Object requestBody, RequestCallback orgCallback, 
Type responseType) {
+  public CseRequestCallback(Object requestBody, RequestCallback 
targetCallback, Type responseType) {
     this.requestBody = requestBody;
-    this.orgCallback = orgCallback;
+    this.targetCallback = targetCallback;
     this.responseType = responseType;
   }
 
@@ -41,7 +41,7 @@ public class CseRequestCallback implements RequestCallback {
    */
   @Override
   public void doWithRequest(ClientHttpRequest request) throws IOException {
-    orgCallback.doWithRequest(request);
+    targetCallback.doWithRequest(request);
     CseClientHttpRequest req = (CseClientHttpRequest) request;
     req.setResponseType(overrideResponseType());
 
diff --git 
a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRestTemplate.java
 
b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRestTemplate.java
index c9b98d3aa..b4f3923b0 100644
--- 
a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRestTemplate.java
+++ 
b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRestTemplate.java
@@ -170,6 +170,13 @@ public class CseRestTemplate extends 
AcceptableRestTemplate {
     return cseCallback;
   }
 
+  @Override
+  public <T> RequestCallback acceptHeaderRequestCallback(Class<T> 
responseType) {
+    RequestCallback callback = super.acceptHeaderRequestCallback(responseType);
+    CseRequestCallback cseCallback = new CseRequestCallback(null, callback, 
responseType);
+    return cseCallback;
+  }
+
   @Override
   public boolean isAcceptable(String uri) {
     return uri.startsWith(RestConst.URI_PREFIX) || 
uri.startsWith(RestConst.URI_PREFIX_NEW);

Reply via email to