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

suncairong pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.2 by this push:
     new 6ec002d709 bugfix: application/x-www-form-urlencoded There is a 
problem with parameter parsing (#14700)
6ec002d709 is described below

commit 6ec002d709dde67321de7ef08541c272b13904e2
Author: funkye <[email protected]>
AuthorDate: Fri Sep 20 21:57:56 2024 +0800

    bugfix: application/x-www-form-urlencoded There is a problem with parameter 
parsing (#14700)
    
    * bugfix: application/x-www-form-urlencoded There is a problem with 
parameter parsing
    
    * bugfix: application/x-www-form-urlencoded There is a problem with 
parameter parsing
---
 .../main/java/org/apache/dubbo/metadata/rest/ArgInfo.java    |  4 ++++
 .../java/org/apache/dubbo/rpc/protocol/rest/RestInvoker.java | 10 +++++-----
 .../param/parse/provider/BodyProviderParamParser.java        |  3 +--
 .../param/parse/provider/ParamProviderParamParser.java       |  4 +++-
 .../rpc/protocol/rest/message/HttpMessageCodecManager.java   |  8 ++++----
 .../dubbo/rpc/protocol/rest/message/HttpMessageDecode.java   |  4 ++--
 .../rpc/protocol/rest/message/codec/ByteArrayCodec.java      |  4 ++--
 .../dubbo/rpc/protocol/rest/message/codec/JsonCodec.java     |  6 +++---
 .../rpc/protocol/rest/message/codec/MultiValueCodec.java     | 12 ++++--------
 .../protocol/rest/message/codec/ResteasyResponseCodec.java   |  4 ++--
 .../dubbo/rpc/protocol/rest/message/codec/StringCodec.java   |  4 ++--
 .../dubbo/rpc/protocol/rest/message/codec/TextCodec.java     |  6 +++---
 .../dubbo/rpc/protocol/rest/message/codec/XMLCodec.java      |  6 +++---
 .../dubbo/rpc/protocol/rest/HttpMessageCodecManagerTest.java |  9 +++++----
 14 files changed, 43 insertions(+), 41 deletions(-)

diff --git 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ArgInfo.java
 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ArgInfo.java
index dc2f7001f8..18713e602a 100644
--- 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ArgInfo.java
+++ 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ArgInfo.java
@@ -160,6 +160,10 @@ public class ArgInfo {
         return actualType;
     }
 
+    public void setActualType(Type actualType) {
+        this.actualType = actualType;
+    }
+
     @Override
     public String toString() {
         return "ArgInfo{" + "index="
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestInvoker.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestInvoker.java
index 5afb5fecd1..0757d67126 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestInvoker.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestInvoker.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.protocol.rest;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.ParameterTypesComparator;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.RestMethodMetadata;
 import org.apache.dubbo.metadata.rest.ServiceRestMetadata;
 import org.apache.dubbo.metadata.rest.media.MediaType;
@@ -109,11 +110,10 @@ public class RestInvoker<T> extends AbstractInvoker<T> {
                             Method reflectMethod = 
restMethodMetadata.getReflectMethod();
                             mediaType =
                                     
MediaTypeUtil.convertMediaType(reflectMethod.getReturnType(), 
r.getContentType());
-                            Object value = 
HttpMessageCodecManager.httpMessageDecode(
-                                    r.getBody(),
-                                    reflectMethod.getReturnType(),
-                                    reflectMethod.getGenericReturnType(),
-                                    mediaType);
+                            ArgInfo argInfo = new ArgInfo();
+                            
argInfo.setParamType(reflectMethod.getReturnType());
+                            
argInfo.setActualType(reflectMethod.getGenericReturnType());
+                            Object value = 
HttpMessageCodecManager.httpMessageDecode(r.getBody(), argInfo, mediaType);
                             appResponse.setValue(value);
                             // resolve response attribute & attachment
                             HttpHeaderUtil.parseResponseHeader(appResponse, r);
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/BodyProviderParamParser.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/BodyProviderParamParser.java
index 022a1c7d60..3b7ac22d09 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/BodyProviderParamParser.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/BodyProviderParamParser.java
@@ -41,8 +41,7 @@ public class BodyProviderParamParser extends 
ProviderParamParser {
         try {
             String contentType = 
parseContext.getRequestFacade().getHeader(RestHeaderEnum.CONTENT_TYPE.getHeader());
             MediaType mediaType = 
MediaTypeUtil.convertMediaType(argInfo.getParamType(), contentType);
-            Object param = HttpMessageCodecManager.httpMessageDecode(
-                    request.getInputStream(), argInfo.getParamType(), 
argInfo.actualReflectType(), mediaType);
+            Object param = 
HttpMessageCodecManager.httpMessageDecode(request.getInputStream(), argInfo, 
mediaType);
             parseContext.setValueByIndex(argInfo.getIndex(), param);
         } catch (Throwable e) {
             throw new ParamParseException("dubbo rest protocol provider body 
param parser  error: " + e.getMessage());
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/ParamProviderParamParser.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/ParamProviderParamParser.java
index be489d33cf..bb7bde7cb4 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/ParamProviderParamParser.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/ParamProviderParamParser.java
@@ -53,7 +53,9 @@ public class ParamProviderParamParser extends 
ProviderParamParser {
         String param = 
request.getParameter(argInfo.getAnnotationNameAttribute());
 
         Object paramValue = paramTypeConvert(argInfo.getParamType(), param);
-        parseContext.setValueByIndex(argInfo.getIndex(), paramValue);
+        if (paramValue != null) {
+            parseContext.setValueByIndex(argInfo.getIndex(), paramValue);
+        }
     }
 
     @Override
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageCodecManager.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageCodecManager.java
index 212ebb4ffb..497b103dee 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageCodecManager.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageCodecManager.java
@@ -17,13 +17,13 @@
 package org.apache.dubbo.rpc.protocol.rest.message;
 
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import 
org.apache.dubbo.rpc.protocol.rest.exception.UnSupportContentTypeException;
 import org.apache.dubbo.rpc.protocol.rest.pair.MessageCodecResultPair;
 
 import java.io.OutputStream;
-import java.lang.reflect.Type;
 import java.util.Set;
 
 public class HttpMessageCodecManager {
@@ -31,15 +31,15 @@ public class HttpMessageCodecManager {
             .getExtensionLoader(HttpMessageCodec.class)
             .getSupportedExtensionInstances();
 
-    public static Object httpMessageDecode(byte[] body, Class<?> type, Type 
actualType, MediaType mediaType)
-            throws Exception {
+    public static Object httpMessageDecode(byte[] body, ArgInfo argInfo, 
MediaType mediaType) throws Exception {
+        Class<?> type = argInfo.getParamType();
         if (body == null || body.length == 0) {
             return null;
         }
 
         for (HttpMessageCodec httpMessageCodec : httpMessageCodecs) {
             if (httpMessageCodec.contentTypeSupport(mediaType, type) || 
typeJudge(mediaType, type, httpMessageCodec)) {
-                return httpMessageCodec.decode(body, type, actualType);
+                return httpMessageCodec.decode(body, argInfo);
             }
         }
         throw new UnSupportContentTypeException("UnSupport content-type :" + 
mediaType.value);
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageDecode.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageDecode.java
index 8b32281600..29e478eb8c 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageDecode.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageDecode.java
@@ -16,9 +16,9 @@
  */
 package org.apache.dubbo.rpc.protocol.rest.message;
 
-import java.lang.reflect.Type;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 
 public interface HttpMessageDecode<InputStream> {
 
-    Object decode(InputStream body, Class<?> targetType, Type actualTYpe) 
throws Exception;
+    Object decode(InputStream body, ArgInfo argInfo) throws Exception;
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/ByteArrayCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/ByteArrayCodec.java
index 2dc0a85ad7..92c1b7ed04 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/ByteArrayCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/ByteArrayCodec.java
@@ -18,11 +18,11 @@ package org.apache.dubbo.rpc.protocol.rest.message.codec;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec;
 
 import java.io.OutputStream;
-import java.lang.reflect.Type;
 
 /**
  *  body type is byte array
@@ -31,7 +31,7 @@ import java.lang.reflect.Type;
 public class ByteArrayCodec implements HttpMessageCodec<byte[], OutputStream> {
 
     @Override
-    public Object decode(byte[] body, Class<?> targetType, Type type) throws 
Exception {
+    public Object decode(byte[] body, ArgInfo argInfo) throws Exception {
         return body;
     }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
index 49994f18b1..3863bdc5ee 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
@@ -19,13 +19,13 @@ package org.apache.dubbo.rpc.protocol.rest.message.codec;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.common.utils.JsonUtils;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec;
 import org.apache.dubbo.rpc.protocol.rest.message.MediaTypeMatcher;
 import org.apache.dubbo.rpc.protocol.rest.util.DataParseUtils;
 
 import java.io.OutputStream;
-import java.lang.reflect.Type;
 import java.nio.charset.StandardCharsets;
 import java.util.HashSet;
 import java.util.Set;
@@ -46,8 +46,8 @@ public class JsonCodec implements HttpMessageCodec<byte[], 
OutputStream> {
     }
 
     @Override
-    public Object decode(byte[] body, Class<?> targetType, Type actualType) 
throws Exception {
-        return DataParseUtils.jsonConvert(actualType, body);
+    public Object decode(byte[] body, ArgInfo argInfo) throws Exception {
+        return DataParseUtils.jsonConvert(argInfo.actualReflectType(), body);
     }
 
     @Override
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/MultiValueCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/MultiValueCodec.java
index a78f793c7b..794feecb51 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/MultiValueCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/MultiValueCodec.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.rpc.protocol.rest.message.codec;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.common.utils.ReflectUtils;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec;
 import org.apache.dubbo.rpc.protocol.rest.message.MediaTypeMatcher;
@@ -26,11 +27,8 @@ import 
org.apache.dubbo.rpc.protocol.rest.util.DataParseUtils;
 
 import java.io.OutputStream;
 import java.lang.reflect.Field;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  *  body is form
@@ -39,17 +37,15 @@ import java.util.Set;
 public class MultiValueCodec implements HttpMessageCodec<byte[], OutputStream> 
{
 
     @Override
-    public Object decode(byte[] body, Class<?> targetType, Type type) throws 
Exception {
+    public Object decode(byte[] body, ArgInfo argInfo) throws Exception {
+        Class<?> targetType = argInfo.getParamType();
         Object map = DataParseUtils.multipartFormConvert(body, targetType);
         Map valuesMap = (Map) map;
         if (Map.class.isAssignableFrom(targetType)) {
             return map;
         } else if (DataParseUtils.isTextType(targetType)) {
 
-            // only fetch  first
-            Set set = valuesMap.keySet();
-            ArrayList arrayList = new ArrayList<>(set);
-            Object key = arrayList.get(0);
+            String key = argInfo.getParamName();
             Object value = valuesMap.get(key);
             if (value == null) {
                 return null;
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/ResteasyResponseCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/ResteasyResponseCodec.java
index 0cb0efc7b1..27ab3ff54b 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/ResteasyResponseCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/ResteasyResponseCodec.java
@@ -20,12 +20,12 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.common.utils.ClassUtils;
 import org.apache.dubbo.common.utils.JsonUtils;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec;
 
 import java.io.OutputStream;
 import java.lang.reflect.Method;
-import java.lang.reflect.Type;
 import java.nio.charset.StandardCharsets;
 
 @Activate(onClass = "javax.ws.rs.core.Response")
@@ -58,7 +58,7 @@ public class ResteasyResponseCodec implements 
HttpMessageCodec<byte[], OutputStr
     }
 
     @Override
-    public Object decode(byte[] body, Class<?> targetType, Type type) throws 
Exception {
+    public Object decode(byte[] body, ArgInfo argInfo) throws Exception {
         if (null == body || body.length == 0) {
             return null;
         }
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/StringCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/StringCodec.java
index 1a543a2ad7..446939fe1f 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/StringCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/StringCodec.java
@@ -18,11 +18,11 @@ package org.apache.dubbo.rpc.protocol.rest.message.codec;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec;
 
 import java.io.OutputStream;
-import java.lang.reflect.Type;
 import java.nio.charset.StandardCharsets;
 
 /**
@@ -32,7 +32,7 @@ import java.nio.charset.StandardCharsets;
 public class StringCodec implements HttpMessageCodec<byte[], OutputStream> {
 
     @Override
-    public Object decode(byte[] body, Class<?> targetType, Type type) throws 
Exception {
+    public Object decode(byte[] body, ArgInfo argInfo) throws Exception {
         if (body == null || body.length == 0) {
             return null;
         }
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/TextCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/TextCodec.java
index 16f13bd413..5897495a07 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/TextCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/TextCodec.java
@@ -18,13 +18,13 @@ package org.apache.dubbo.rpc.protocol.rest.message.codec;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec;
 import org.apache.dubbo.rpc.protocol.rest.message.MediaTypeMatcher;
 import org.apache.dubbo.rpc.protocol.rest.util.DataParseUtils;
 
 import java.io.OutputStream;
-import java.lang.reflect.Type;
 import java.nio.charset.StandardCharsets;
 
 /**
@@ -34,8 +34,8 @@ import java.nio.charset.StandardCharsets;
 public class TextCodec implements HttpMessageCodec<byte[], OutputStream> {
 
     @Override
-    public Object decode(byte[] body, Class<?> targetType, Type type) throws 
Exception {
-        return DataParseUtils.stringTypeConvert(targetType, new String(body, 
StandardCharsets.UTF_8));
+    public Object decode(byte[] body, ArgInfo argInfo) throws Exception {
+        return DataParseUtils.stringTypeConvert(argInfo.getParamType(), new 
String(body, StandardCharsets.UTF_8));
     }
 
     @Override
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/XMLCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/XMLCodec.java
index f696c91e8e..e75b7dfce4 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/XMLCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/XMLCodec.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.protocol.rest.message.codec;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec;
 import org.apache.dubbo.rpc.protocol.rest.message.MediaTypeMatcher;
@@ -31,7 +32,6 @@ import javax.xml.transform.sax.SAXSource;
 
 import java.io.OutputStream;
 import java.io.StringReader;
-import java.lang.reflect.Type;
 
 import org.xml.sax.InputSource;
 
@@ -42,7 +42,7 @@ import org.xml.sax.InputSource;
 public class XMLCodec implements HttpMessageCodec<byte[], OutputStream> {
 
     @Override
-    public Object decode(byte[] body, Class<?> targetType, Type type) throws 
Exception {
+    public Object decode(byte[] body, ArgInfo argInfo) throws Exception {
 
         SAXParserFactory spf = SAXParserFactory.newInstance();
         
spf.setFeature("http://xml.org/sax/features/external-general-entities";, false);
@@ -53,7 +53,7 @@ public class XMLCodec implements HttpMessageCodec<byte[], 
OutputStream> {
         Source xmlSource =
                 new SAXSource(spf.newSAXParser().getXMLReader(), new 
InputSource(new StringReader(new String(body))));
 
-        JAXBContext context = JAXBContext.newInstance(targetType);
+        JAXBContext context = JAXBContext.newInstance(argInfo.getParamType());
         Unmarshaller unmarshaller = context.createUnmarshaller();
         return unmarshaller.unmarshal(xmlSource);
     }
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/HttpMessageCodecManagerTest.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/HttpMessageCodecManagerTest.java
index 06c0ff5e18..ab9a0481c1 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/HttpMessageCodecManagerTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/HttpMessageCodecManagerTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.rpc.protocol.rest;
 
+import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodecManager;
 import org.apache.dubbo.rpc.protocol.rest.message.codec.XMLCodec;
@@ -38,11 +39,11 @@ public class HttpMessageCodecManagerTest {
         HttpMessageCodecManager.httpMessageEncode(
                 byteArrayOutputStream, registrationResult, null, 
MediaType.TEXT_XML, null);
 
+        ArgInfo argInfo = new ArgInfo();
+        argInfo.setActualType(RegistrationResult.class);
+        argInfo.setParamType(RegistrationResult.class);
         Object o = HttpMessageCodecManager.httpMessageDecode(
-                byteArrayOutputStream.toByteArray(),
-                RegistrationResult.class,
-                RegistrationResult.class,
-                MediaType.TEXT_XML);
+                byteArrayOutputStream.toByteArray(), argInfo, 
MediaType.TEXT_XML);
 
         Assertions.assertEquals(registrationResult, o);
 

Reply via email to