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

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


The following commit(s) were added to refs/heads/3.3 by this push:
     new 164c1e4ceb Keep the behavior consistent with SpringMVC when access 
through browser (#14816)
164c1e4ceb is described below

commit 164c1e4cebc62f1cbb4f5f27328da5964390ec90
Author: Sean Yang <[email protected]>
AuthorDate: Fri Oct 25 17:51:05 2024 +0800

    Keep the behavior consistent with SpringMVC when access through browser 
(#14816)
---
 .../apache/dubbo/remoting/http12/HttpUtils.java    |  2 +-
 .../dubbo/remoting/http12/message/MediaType.java   | 20 ++++++-----
 .../remoting/http12/message/codec/HtmlCodec.java   | 22 ++++++++++--
 .../http12/message/codec/HtmlCodecFactory.java     |  4 +--
 .../http12/message/codec/PlainTextCodec.java       | 17 ++++++++--
 .../message/codec/PlainTextCodecFactory.java       |  6 ++--
 .../remoting/http12/message/codec/CodecTest.java   |  2 +-
 .../protocol/tri/rest/RestHttpMessageCodec.java    |  7 ----
 .../tri/rest/mapping/ContentNegotiator.java        | 39 +++++++++++++++++-----
 .../protocol/tri/rest/mapping/RequestMapping.java  |  2 +-
 .../rest/mapping/RestRequestHandlerMapping.java    |  9 +----
 .../tri/rest/support/basic/RestProtocolTest.groovy | 13 ++++++++
 12 files changed, 97 insertions(+), 46 deletions(-)

diff --git 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/HttpUtils.java
 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/HttpUtils.java
index d20ccec53c..311d5bcb71 100644
--- 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/HttpUtils.java
+++ 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/HttpUtils.java
@@ -93,10 +93,10 @@ public final class HttpUtils {
     }
 
     public static List<String> parseAccept(String header) {
-        List<Item<String>> mediaTypes = new ArrayList<>();
         if (header == null) {
             return Collections.emptyList();
         }
+        List<Item<String>> mediaTypes = new ArrayList<>();
         for (String item : StringUtils.tokenize(header, ',')) {
             int index = item.indexOf(';');
             mediaTypes.add(new Item<>(StringUtils.substring(item, 0, index), 
parseQuality(item, index)));
diff --git 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/MediaType.java
 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/MediaType.java
index fd7af73004..84f71ce681 100644
--- 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/MediaType.java
+++ 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/MediaType.java
@@ -20,6 +20,8 @@ public final class MediaType {
 
     public static final String WILDCARD = "*";
 
+    public static final String TEXT = "text";
+
     public static final MediaType ALL = new MediaType(WILDCARD, WILDCARD);
 
     public static final MediaType APPLICATION_JSON = new 
MediaType("application", "json");
@@ -40,21 +42,21 @@ public final class MediaType {
 
     public static final MediaType MULTIPART_FORM_DATA = new 
MediaType("multipart", "form-data");
 
-    public static final MediaType TEXT_JSON = new MediaType("text", "json");
+    public static final MediaType TEXT_JSON = new MediaType(TEXT, "json");
 
-    public static final MediaType TEXT_XML = new MediaType("text", "xml");
+    public static final MediaType TEXT_XML = new MediaType(TEXT, "xml");
 
-    public static final MediaType TEXT_YAML = new MediaType("text", "yaml");
+    public static final MediaType TEXT_YAML = new MediaType(TEXT, "yaml");
 
-    public static final MediaType TEXT_CSS = new MediaType("text", "css");
+    public static final MediaType TEXT_CSS = new MediaType(TEXT, "css");
 
-    public static final MediaType TEXT_JAVASCRIPT = new MediaType("text", 
"javascript");
+    public static final MediaType TEXT_JAVASCRIPT = new MediaType(TEXT, 
"javascript");
 
-    public static final MediaType TEXT_HTML = new MediaType("text", "html");
+    public static final MediaType TEXT_HTML = new MediaType(TEXT, "html");
 
-    public static final MediaType TEXT_PLAIN = new MediaType("text", "plain");
+    public static final MediaType TEXT_PLAIN = new MediaType(TEXT, "plain");
 
-    public static final MediaType TEXT_EVENT_STREAM = new MediaType("text", 
"event-stream");
+    public static final MediaType TEXT_EVENT_STREAM = new MediaType(TEXT, 
"event-stream");
 
     private final String name;
 
@@ -81,6 +83,6 @@ public final class MediaType {
     }
 
     public boolean isPureText() {
-        return this == TEXT_HTML || this == TEXT_PLAIN;
+        return TEXT.equals(type);
     }
 }
diff --git 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/HtmlCodec.java
 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/HtmlCodec.java
index 5afc69b028..378df57d54 100644
--- 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/HtmlCodec.java
+++ 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/HtmlCodec.java
@@ -17,27 +17,43 @@
 package org.apache.dubbo.remoting.http12.message.codec;
 
 import org.apache.dubbo.common.io.StreamUtils;
-import org.apache.dubbo.common.utils.JsonUtils;
+import org.apache.dubbo.remoting.http12.HttpJsonUtils;
 import org.apache.dubbo.remoting.http12.exception.DecodeException;
 import org.apache.dubbo.remoting.http12.exception.EncodeException;
 import org.apache.dubbo.remoting.http12.exception.HttpStatusException;
 import org.apache.dubbo.remoting.http12.message.HttpMessageCodec;
 import org.apache.dubbo.remoting.http12.message.MediaType;
+import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.Charset;
 
-public class HtmlCodec implements HttpMessageCodec {
+public final class HtmlCodec implements HttpMessageCodec {
+
+    public static final HtmlCodec INSTANCE = new HtmlCodec();
+
+    private final HttpJsonUtils httpJsonUtils;
+
+    private HtmlCodec() {
+        this(FrameworkModel.defaultModel());
+    }
+
+    public HtmlCodec(FrameworkModel frameworkModel) {
+        httpJsonUtils = 
frameworkModel.getBeanFactory().getOrRegisterBean(HttpJsonUtils.class);
+    }
 
     @Override
     public void encode(OutputStream os, Object data, Charset charset) throws 
EncodeException {
+        if (data == null) {
+            return;
+        }
         try {
             if (data instanceof CharSequence) {
                 os.write((data.toString()).getBytes(charset));
                 return;
             }
-            os.write(JsonUtils.toJson(data).getBytes(charset));
+            os.write(httpJsonUtils.toJson(data).getBytes(charset));
         } catch (HttpStatusException e) {
             throw e;
         } catch (Throwable t) {
diff --git 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/HtmlCodecFactory.java
 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/HtmlCodecFactory.java
index ee82e05bd0..4d09457121 100644
--- 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/HtmlCodecFactory.java
+++ 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/HtmlCodecFactory.java
@@ -27,11 +27,9 @@ import org.apache.dubbo.rpc.model.FrameworkModel;
 @Activate
 public final class HtmlCodecFactory implements HttpMessageEncoderFactory, 
HttpMessageDecoderFactory {
 
-    private static final HtmlCodec INSTANCE = new HtmlCodec();
-
     @Override
     public HttpMessageCodec createCodec(URL url, FrameworkModel 
frameworkModel, String mediaType) {
-        return INSTANCE;
+        return frameworkModel == FrameworkModel.defaultModel() ? 
HtmlCodec.INSTANCE : new HtmlCodec(frameworkModel);
     }
 
     @Override
diff --git 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/PlainTextCodec.java
 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/PlainTextCodec.java
index 3ec4a99032..3f3ec22a75 100644
--- 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/PlainTextCodec.java
+++ 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/PlainTextCodec.java
@@ -17,12 +17,13 @@
 package org.apache.dubbo.remoting.http12.message.codec;
 
 import org.apache.dubbo.common.io.StreamUtils;
-import org.apache.dubbo.common.utils.JsonUtils;
+import org.apache.dubbo.remoting.http12.HttpJsonUtils;
 import org.apache.dubbo.remoting.http12.exception.DecodeException;
 import org.apache.dubbo.remoting.http12.exception.EncodeException;
 import org.apache.dubbo.remoting.http12.exception.HttpStatusException;
 import org.apache.dubbo.remoting.http12.message.HttpMessageCodec;
 import org.apache.dubbo.remoting.http12.message.MediaType;
+import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -30,6 +31,18 @@ import java.nio.charset.Charset;
 
 public final class PlainTextCodec implements HttpMessageCodec {
 
+    public static final PlainTextCodec INSTANCE = new PlainTextCodec();
+
+    private final HttpJsonUtils httpJsonUtils;
+
+    private PlainTextCodec() {
+        this(FrameworkModel.defaultModel());
+    }
+
+    public PlainTextCodec(FrameworkModel frameworkModel) {
+        httpJsonUtils = 
frameworkModel.getBeanFactory().getOrRegisterBean(HttpJsonUtils.class);
+    }
+
     @Override
     public void encode(OutputStream os, Object data, Charset charset) throws 
EncodeException {
         if (data == null) {
@@ -40,7 +53,7 @@ public final class PlainTextCodec implements HttpMessageCodec 
{
                 os.write((data.toString()).getBytes(charset));
                 return;
             }
-            os.write(JsonUtils.toJson(data).getBytes(charset));
+            os.write(httpJsonUtils.toJson(data).getBytes(charset));
         } catch (HttpStatusException e) {
             throw e;
         } catch (Throwable t) {
diff --git 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/PlainTextCodecFactory.java
 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/PlainTextCodecFactory.java
index 69dbc7cfb3..bed8a7fcd5 100644
--- 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/PlainTextCodecFactory.java
+++ 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/PlainTextCodecFactory.java
@@ -27,11 +27,11 @@ import org.apache.dubbo.rpc.model.FrameworkModel;
 @Activate(order = 10000)
 public final class PlainTextCodecFactory implements HttpMessageEncoderFactory, 
HttpMessageDecoderFactory {
 
-    private static final PlainTextCodec INSTANCE = new PlainTextCodec();
-
     @Override
     public HttpMessageCodec createCodec(URL url, FrameworkModel 
frameworkModel, String mediaType) {
-        return INSTANCE;
+        return frameworkModel == FrameworkModel.defaultModel()
+                ? PlainTextCodec.INSTANCE
+                : new PlainTextCodec(frameworkModel);
     }
 
     @Override
diff --git 
a/dubbo-remoting/dubbo-remoting-http12/src/test/java/org/apache/dubbo/remoting/http12/message/codec/CodecTest.java
 
b/dubbo-remoting/dubbo-remoting-http12/src/test/java/org/apache/dubbo/remoting/http12/message/codec/CodecTest.java
index 9d6d573eef..43f76abb4a 100644
--- 
a/dubbo-remoting/dubbo-remoting-http12/src/test/java/org/apache/dubbo/remoting/http12/message/codec/CodecTest.java
+++ 
b/dubbo-remoting/dubbo-remoting-http12/src/test/java/org/apache/dubbo/remoting/http12/message/codec/CodecTest.java
@@ -75,7 +75,7 @@ public class CodecTest {
         Assertions.assertEquals("Hello, world", res);
 
         in = new ByteArrayInputStream(utf8Bytes);
-        codec = new PlainTextCodec();
+        codec = PlainTextCodec.INSTANCE;
         res = (String) codec.decode(in, String.class, Charsets.UTF_8);
         Assertions.assertEquals("你好,世界", res);
 
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java
index cd6df6f4d6..13cc0bd615 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java
@@ -26,7 +26,6 @@ import 
org.apache.dubbo.remoting.http12.message.HttpMessageDecoder;
 import org.apache.dubbo.remoting.http12.message.HttpMessageEncoder;
 import org.apache.dubbo.remoting.http12.message.MediaType;
 import org.apache.dubbo.rpc.protocol.tri.rest.argument.ArgumentResolver;
-import org.apache.dubbo.rpc.protocol.tri.rest.argument.TypeConverter;
 import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
 
 import java.io.ByteArrayInputStream;
@@ -44,7 +43,6 @@ public final class RestHttpMessageCodec implements 
HttpMessageDecoder, HttpMessa
     private final HttpResponse response;
     private final ParameterMeta[] parameters;
     private final ArgumentResolver argumentResolver;
-    private final TypeConverter typeConverter;
     private final HttpMessageEncoder messageEncoder;
     private final Charset charset;
 
@@ -53,13 +51,11 @@ public final class RestHttpMessageCodec implements 
HttpMessageDecoder, HttpMessa
             HttpResponse response,
             ParameterMeta[] parameters,
             ArgumentResolver argumentResolver,
-            TypeConverter typeConverter,
             HttpMessageEncoder messageEncoder) {
         this.request = request;
         this.response = response;
         this.parameters = parameters;
         this.argumentResolver = argumentResolver;
-        this.typeConverter = typeConverter;
         this.messageEncoder = messageEncoder;
         charset = request.charsetOrDefault();
     }
@@ -125,9 +121,6 @@ public final class RestHttpMessageCodec implements 
HttpMessageDecoder, HttpMessa
                     }
                     return;
                 }
-                if (messageEncoder.mediaType().isPureText() && type != 
String.class) {
-                    data = typeConverter.convert(data, String.class);
-                }
             } catch (HttpStatusException e) {
                 throw e;
             } catch (Exception e) {
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/ContentNegotiator.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/ContentNegotiator.java
index acc27fafee..713d695e5e 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/ContentNegotiator.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/ContentNegotiator.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.remoting.http12.message.MediaType;
 import org.apache.dubbo.remoting.http12.message.codec.CodecUtils;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.protocol.tri.rest.RestConstants;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.HandlerMeta;
 
 import java.util.HashMap;
 import java.util.List;
@@ -44,7 +45,7 @@ public class ContentNegotiator {
         codecUtils = 
frameworkModel.getBeanFactory().getOrRegisterBean(CodecUtils.class);
     }
 
-    public String negotiate(HttpRequest request) {
+    public String negotiate(HttpRequest request, HandlerMeta meta) {
         String mediaType;
 
         // 1. find mediaType by producible
@@ -60,11 +61,19 @@ public class ContentNegotiator {
 
         // 2. find mediaType by accept header
         List<String> accepts = HttpUtils.parseAccept(request.accept());
+        String preferMediaType = null;
+        boolean hasAll = false;
         if (accepts != null) {
             for (int i = 0, size = accepts.size(); i < size; i++) {
-                mediaType = getSuitableMediaType(accepts.get(i));
-                if (mediaType != null) {
-                    return mediaType;
+                String accept = accepts.get(i);
+                if (!hasAll && MediaType.ALL.getName().equals(accept)) {
+                    hasAll = true;
+                }
+                if (preferMediaType == null) {
+                    mediaType = getSuitableMediaType(accept);
+                    if (mediaType != null) {
+                        preferMediaType = mediaType;
+                    }
                 }
             }
         }
@@ -78,15 +87,29 @@ public class ContentNegotiator {
             }
         }
 
-        // 5. find mediaType by extension
+        // 4. find mediaType by extension
         String path = request.rawPath();
         int index = path.lastIndexOf('.');
         if (index != -1) {
-            String extension = path.substring(index + 1);
-            return getMediaTypeByExtension(extension);
+            mediaType = getMediaTypeByExtension(path.substring(index + 1));
+            if (mediaType != null) {
+                return mediaType;
+            }
+        }
+
+        if (preferMediaType == null) {
+            return null;
+        }
+
+        // Keep consistent with Spring MVC behavior
+        if (hasAll && preferMediaType.startsWith("text/")) {
+            Class<?> responseType = 
meta.getMethodMetadata().getActualResponseType();
+            if (responseType != null && 
!CharSequence.class.isAssignableFrom(responseType)) {
+                return MediaType.APPLICATION_JSON.getName();
+            }
         }
 
-        return null;
+        return preferMediaType;
     }
 
     public boolean supportExtension(String extension) {
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RequestMapping.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RequestMapping.java
index 4264594e01..a8a829d02d 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RequestMapping.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RequestMapping.java
@@ -465,7 +465,7 @@ public final class RequestMapping implements 
Condition<RequestMapping, HttpReque
                     isEmpty(consumes) ? null : new ConsumesCondition(consumes),
                     isEmpty(produces) ? null : new ProducesCondition(produces),
                     customCondition == null ? null : 
ConditionWrapper.wrap(customCondition),
-                    cors == null ? null : cors,
+                    cors == null || cors.isEmpty() ? null : cors,
                     responseStatus == null ? null : new 
ResponseMeta(responseStatus, responseReason));
         }
     }
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RestRequestHandlerMapping.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RestRequestHandlerMapping.java
index 73aaffc2f9..faf9ed6113 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RestRequestHandlerMapping.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RestRequestHandlerMapping.java
@@ -36,8 +36,6 @@ import org.apache.dubbo.rpc.protocol.tri.rest.RestConstants;
 import org.apache.dubbo.rpc.protocol.tri.rest.RestHttpMessageCodec;
 import org.apache.dubbo.rpc.protocol.tri.rest.argument.ArgumentResolver;
 import 
org.apache.dubbo.rpc.protocol.tri.rest.argument.CompositeArgumentResolver;
-import org.apache.dubbo.rpc.protocol.tri.rest.argument.GeneralTypeConverter;
-import org.apache.dubbo.rpc.protocol.tri.rest.argument.TypeConverter;
 import 
org.apache.dubbo.rpc.protocol.tri.rest.mapping.condition.MethodsCondition;
 import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.HandlerMeta;
 import org.apache.dubbo.rpc.protocol.tri.rest.util.RequestUtils;
@@ -51,19 +49,15 @@ public final class RestRequestHandlerMapping implements 
RequestHandlerMapping {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(RestRequestHandlerMapping.class);
 
-    private final FrameworkModel frameworkModel;
     private final RequestMappingRegistry requestMappingRegistry;
     private final ArgumentResolver argumentResolver;
-    private final TypeConverter typeConverter;
     private final ContentNegotiator contentNegotiator;
     private final CodecUtils codecUtils;
 
     public RestRequestHandlerMapping(FrameworkModel frameworkModel) {
-        this.frameworkModel = frameworkModel;
         ScopeBeanFactory beanFactory = frameworkModel.getBeanFactory();
         requestMappingRegistry = 
beanFactory.getOrRegisterBean(DefaultRequestMappingRegistry.class);
         argumentResolver = 
beanFactory.getOrRegisterBean(CompositeArgumentResolver.class);
-        typeConverter = 
beanFactory.getOrRegisterBean(GeneralTypeConverter.class);
         contentNegotiator = 
beanFactory.getOrRegisterBean(ContentNegotiator.class);
         codecUtils = beanFactory.getOrRegisterBean(CodecUtils.class);
     }
@@ -89,7 +83,7 @@ public final class RestRequestHandlerMapping implements 
RequestHandlerMapping {
         }
 
         String requestMediaType = request.mediaType();
-        String responseMediaType = contentNegotiator.negotiate(request);
+        String responseMediaType = contentNegotiator.negotiate(request, meta);
         if (responseMediaType != null) {
             response.setContentType(responseMediaType);
         } else {
@@ -104,7 +98,6 @@ public final class RestRequestHandlerMapping implements 
RequestHandlerMapping {
                 response,
                 meta.getParameters(),
                 argumentResolver,
-                typeConverter,
                 codecUtils.determineHttpMessageEncoder(url, 
responseMediaType));
 
         if (HttpMethods.supportBody(method) && 
!RequestUtils.isFormOrMultiPart(request)) {
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/RestProtocolTest.groovy
 
b/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/RestProtocolTest.groovy
index 57e836d44a..dc2ffb9332 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/RestProtocolTest.groovy
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/RestProtocolTest.groovy
@@ -291,4 +291,17 @@ class RestProtocolTest extends BaseServiceTest {
             'POST' | '/mismatchTest?name=earth' | 'text/plain'       | 
'text/plain'       | '{"message":"Unsatisfied query parameter 
conditions","status":"400"}'
     }
 
+    def "consistent with SpringMVC"() {
+        given:
+            def request = new TestRequest(
+                path: path,
+                accept: 
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
+            )
+        expect:
+            runner.run(request).contentType == contentType
+        where:
+            path | contentType
+            '/beanArgTest' | 'application/json'
+    }
+
 }

Reply via email to