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

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


The following commit(s) were added to refs/heads/master by this push:
     new 52dd8feac [#4378]Fix getForObject not properly handle response type 
(#4380)
52dd8feac is described below

commit 52dd8feac6aa17c3dc832e9e2cdf3180ae8bfe2a
Author: liubao68 <[email protected]>
AuthorDate: Tue Jun 25 10:58:52 2024 +0800

    [#4378]Fix getForObject not properly handle response type (#4380)
---
 .../servicecomb/demo/controller/PersonAlias.java   | 35 ++++++++++++++++++++++
 .../demo/springmvc/client/TestControllerImpl.java  | 12 ++++++++
 .../demo/springmvc/server/ControllerImpl.java      | 17 +++++++----
 .../springmvc/reference/CseRequestCallback.java    |  8 ++---
 .../springmvc/reference/CseRestTemplate.java       |  7 +++++
 5 files changed, 70 insertions(+), 9 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-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 7e74b18fc..295f1bbe0 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.foundation.common.LegacyPropertyFactory;
 import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
 import org.springframework.stereotype.Component;
@@ -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 42f35a20c..0cd4db2dc 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
@@ -19,11 +19,6 @@ package org.apache.servicecomb.demo.springmvc.server;
 
 import java.util.Arrays;
 
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.validation.constraints.Min;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response.Status;
-
 import org.apache.servicecomb.demo.controller.Person;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
 import org.apache.servicecomb.swagger.invocation.context.ContextUtils;
@@ -37,6 +32,11 @@ import 
org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.constraints.Min;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response.Status;
+
 // This class tests "contract first", the controller.yaml will override 
annotations defined in class.
 
 @RestSchema(schemaId = "controller")
@@ -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