* When the data accessed for the first time, add it to history list. If the size of history list reaches max capacity, eliminate the earliest data (first in first out).
* When the data already exists in the history list, and be accessed for the second time, then it will be put into cache.
- *
+ *
* TODO, consider replacing with ConcurrentHashMap to improve performance under concurrency
*/
public class LRU2Cache extends LinkedHashMap {
@@ -33,8 +34,8 @@ public class LRU2Cache extends LinkedHashMap {
private static final long serialVersionUID = -5167631809472116969L;
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
-
private static final int DEFAULT_MAX_CAPACITY = 1000;
+
private final Lock lock = new ReentrantLock();
private volatile int maxCapacity;
@@ -94,6 +95,16 @@ public V put(K key, V value) {
}
}
+ @Override
+ public V computeIfAbsent(K key, Function super K, ? extends V> fn) {
+ V value = get(key);
+ if (value == null) {
+ value = fn.apply(key);
+ put(key, value);
+ }
+ return value;
+ }
+
@Override
public V remove(Object key) {
lock.lock();
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java
index 76d6c19cb71..079fb0766a5 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java
@@ -19,6 +19,7 @@
import java.util.LinkedHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
+import java.util.function.Function;
/**
* A 'least recently used' cache based on LinkedHashMap.
@@ -31,8 +32,8 @@ public class LRUCache extends LinkedHashMap {
private static final long serialVersionUID = -5167631809472116969L;
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
-
private static final int DEFAULT_MAX_CAPACITY = 1000;
+
private final Lock lock = new ReentrantLock();
private volatile int maxCapacity;
@@ -110,6 +111,20 @@ public void clear() {
}
}
+ @Override
+ public V computeIfAbsent(K key, Function super K, ? extends V> fn) {
+ V value = get(key);
+ if (value == null) {
+ lock.lock();
+ try {
+ return super.computeIfAbsent(key, fn);
+ } finally {
+ lock.unlock();
+ }
+ }
+ return value;
+ }
+
public void lock() {
lock.lock();
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/Pair.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/Pair.java
new file mode 100644
index 00000000000..d719ff30613
--- /dev/null
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/Pair.java
@@ -0,0 +1,138 @@
+/*
+ * 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.dubbo.common.utils;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+public final class Pair implements Map.Entry, Comparable>, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @SuppressWarnings("rawtypes")
+ private static final Pair NULL = new Pair<>(null, null);
+
+ public final L left;
+ public final R right;
+
+ public static Pair of(L left, R right) {
+ return left == null && right == null ? nullPair() : new Pair<>(left, right);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static Pair nullPair() {
+ return NULL;
+ }
+
+ @SafeVarargs
+ public static Map toMap(Pair... pairs) {
+ if (pairs == null) {
+ return Collections.emptyMap();
+ }
+ return toMap(Arrays.asList(pairs));
+ }
+
+ public static Map toMap(Collection> pairs) {
+ if (pairs == null) {
+ return Collections.emptyMap();
+ }
+ Map map = CollectionUtils.newLinkedHashMap(pairs.size());
+ for (Pair pair : pairs) {
+ map.put(pair.getLeft(), pair.getRight());
+ }
+ return map;
+ }
+
+ public static List> toPairs(Map map) {
+ if (map == null) {
+ return Collections.emptyList();
+ }
+ List> pairs = new ArrayList<>(map.size());
+ for (Map.Entry entry : map.entrySet()) {
+ pairs.add(of(entry.getKey(), entry.getValue()));
+ }
+ return pairs;
+ }
+
+ public Pair(L left, R right) {
+ this.left = left;
+ this.right = right;
+ }
+
+ public L getLeft() {
+ return left;
+ }
+
+ public R getRight() {
+ return right;
+ }
+
+ public boolean isNull() {
+ return this == NULL || left == null && right == null;
+ }
+
+ @Override
+ public L getKey() {
+ return left;
+ }
+
+ @Override
+ public R getValue() {
+ return right;
+ }
+
+ @Override
+ public R setValue(R value) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public int compareTo(Pair other) {
+ return left.equals(other.left)
+ ? ((Comparable) right).compareTo(other.right)
+ : ((Comparable) left).compareTo(other.left);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(left) ^ Objects.hashCode(right);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other instanceof Map.Entry) {
+ Map.Entry, ?> that = (Map.Entry, ?>) other;
+ return Objects.equals(left, that.getKey()) && Objects.equals(right, that.getValue());
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "(" + left + ", " + right + ')';
+ }
+}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
index 0a8cba4bcd4..2b86d0e256f 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
@@ -1256,10 +1256,6 @@ public static String toCommaDelimitedString(String one, String... others) {
/**
* Test str whether starts with the prefix ignore case.
- *
- * @param str
- * @param prefix
- * @return
*/
public static boolean startsWithIgnoreCase(String str, String prefix) {
if (str == null || prefix == null || str.length() < prefix.length()) {
@@ -1268,4 +1264,102 @@ public static boolean startsWithIgnoreCase(String str, String prefix) {
// return str.substring(0, prefix.length()).equalsIgnoreCase(prefix);
return str.regionMatches(true, 0, prefix, 0, prefix.length());
}
+
+ public static String defaultIf(String str, String defaultStr) {
+ return isEmpty(str) ? defaultStr : str;
+ }
+
+ /**
+ * Returns a substring from 'str' between 'start' and 'end', or to the end if 'end' is -1
+ */
+ public static String substring(String str, int start, int end) {
+ if (str == null) {
+ return null;
+ }
+ return end == INDEX_NOT_FOUND ? str.substring(start) : str.substring(start, end);
+ }
+
+ /**
+ * Extracts a substring from the given string that precedes the first occurrence of the specified character separator.
+ * If the character is not found, the entire string is returned.
+ */
+ public static String substringBefore(String str, int separator) {
+ if (isEmpty(str)) {
+ return str;
+ }
+ int index = str.indexOf(separator);
+ return index == INDEX_NOT_FOUND ? str : str.substring(0, index);
+ }
+
+ /**
+ * Extracts a substring from the given string that precedes the first occurrence of the specified string separator.
+ * If the separator is not found or is null, the entire string is returned.
+ */
+ public static String substringBefore(String str, String separator) {
+ if (isEmpty(str) || separator == null) {
+ return str;
+ }
+ if (separator.isEmpty()) {
+ return EMPTY_STRING;
+ }
+ int index = str.indexOf(separator);
+ return index == INDEX_NOT_FOUND ? str : str.substring(0, index);
+ }
+
+ /**
+ * Tokenize the given String into a String array.
+ * Trims tokens and omits empty tokens.
+ */
+ public static String[] tokenize(String str, char... separators) {
+ if (isEmpty(str)) {
+ return EMPTY_STRING_ARRAY;
+ }
+ return tokenizeToList(str, separators).toArray(EMPTY_STRING_ARRAY);
+ }
+
+ public static List tokenizeToList(String str, char... separators) {
+ if (isEmpty(str)) {
+ return Collections.emptyList();
+ }
+ if (separators == null || separators.length == 0) {
+ separators = new char[] {','};
+ }
+ List tokens = new ArrayList<>();
+ int start = -1, end = 0;
+ int i = 0;
+ out:
+ for (int len = str.length(), sLen = separators.length; i < len; i++) {
+ char c = str.charAt(i);
+ for (int j = 0; j < sLen; j++) {
+ if (c == separators[j]) {
+ if (start > -1) {
+ tokens.add(str.substring(start, end + 1));
+ start = -1;
+ }
+ continue out;
+ }
+ }
+ switch (c) {
+ case ' ':
+ case '\t':
+ case '\n':
+ case '\r':
+ break;
+ default:
+ if (start == -1) {
+ start = i;
+ }
+ end = i;
+ break;
+ }
+ }
+ if (start > -1) {
+ String part = str.substring(start, end + 1);
+ if (tokens.isEmpty()) {
+ return Collections.singletonList(part);
+ }
+ tokens.add(part);
+ }
+ return tokens;
+ }
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/RestConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/RestConfig.java
new file mode 100644
index 00000000000..6a3674e119a
--- /dev/null
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/RestConfig.java
@@ -0,0 +1,118 @@
+/*
+ * 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.dubbo.config;
+
+import java.io.Serializable;
+
+/**
+ * Configuration for triple rest protocol.
+ */
+public class RestConfig implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Maximum allowed size for request bodies.
+ * Limits the size of request to prevent excessively large request.
+ *
The default value is 8MiB.
+ */
+ private Integer maxBodySize;
+
+ /**
+ * Maximum allowed size for response bodies.
+ * Limits the size of responses to prevent excessively large response.
+ *
The default value is 8MiB.
+ */
+ private Integer maxResponseBodySize;
+
+ /**
+ * Whether path matching should be match paths with a trailing slash.
+ * If enabled, a method mapped to "/users" also matches to "/users/".
+ *
The default value is {@code true}.
+ */
+ private Boolean trailingSlashMatch;
+
+ /**
+ * Whether path matching should be case-sensitive.
+ * If enabled, a method mapped to "/users" won't match to "/Users/".
+ *
The default value is {@code false}.
+ */
+ private Boolean caseSensitiveMatch;
+
+ /**
+ * Whether path matching uses suffix pattern matching (".*").
+ * If enabled, a method mapped to "/users" also matches to "/users.*".
+ *
This also enables suffix content negotiation, with the media-type
+ * inferred from the URL suffix, e.g., ".json" for "application/json".
+ *
The default value is {@code true}.
+ */
+ private Boolean suffixPatternMatch;
+
+ /**
+ * The parameter name that can be used to specify the response format.
+ *
The default value is 'format'.
+ */
+ private String formatParameterName;
+
+ public Integer getMaxBodySize() {
+ return maxBodySize;
+ }
+
+ public void setMaxBodySize(Integer maxBodySize) {
+ this.maxBodySize = maxBodySize;
+ }
+
+ public Integer getMaxResponseBodySize() {
+ return maxResponseBodySize;
+ }
+
+ public void setMaxResponseBodySize(Integer maxResponseBodySize) {
+ this.maxResponseBodySize = maxResponseBodySize;
+ }
+
+ public Boolean getTrailingSlashMatch() {
+ return trailingSlashMatch;
+ }
+
+ public void setTrailingSlashMatch(Boolean trailingSlashMatch) {
+ this.trailingSlashMatch = trailingSlashMatch;
+ }
+
+ public Boolean getCaseSensitiveMatch() {
+ return caseSensitiveMatch;
+ }
+
+ public void setCaseSensitiveMatch(Boolean caseSensitiveMatch) {
+ this.caseSensitiveMatch = caseSensitiveMatch;
+ }
+
+ public Boolean getSuffixPatternMatch() {
+ return suffixPatternMatch;
+ }
+
+ public void setSuffixPatternMatch(Boolean suffixPatternMatch) {
+ this.suffixPatternMatch = suffixPatternMatch;
+ }
+
+ public String getFormatParameterName() {
+ return formatParameterName;
+ }
+
+ public void setFormatParameterName(String formatParameterName) {
+ this.formatParameterName = formatParameterName;
+ }
+}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/TripleConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/TripleConfig.java
index a10d909fbc4..1b7469ee21a 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/TripleConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/TripleConfig.java
@@ -55,6 +55,11 @@ public class TripleConfig implements Serializable {
*/
private String maxHeaderListSize;
+ /**
+ * Whether to pass through standard HTTP headers, default is false.
+ */
+ private Boolean passThroughStandardHttpHeaders;
+
public String getHeaderTableSize() {
return headerTableSize;
}
@@ -102,4 +107,12 @@ public String getMaxHeaderListSize() {
public void setMaxHeaderListSize(String maxHeaderListSize) {
this.maxHeaderListSize = maxHeaderListSize;
}
+
+ public Boolean getPassThroughStandardHttpHeaders() {
+ return passThroughStandardHttpHeaders;
+ }
+
+ public void setPassThroughStandardHttpHeaders(Boolean passThroughStandardHttpHeaders) {
+ this.passThroughStandardHttpHeaders = passThroughStandardHttpHeaders;
+ }
}
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
index e1e09381533..e4b37d2ad4e 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
@@ -1218,6 +1218,7 @@ public void checkState(ModuleModel moduleModel, DeployState moduleState) {
// cannot change to pending from other state
// setPending();
break;
+ default:
}
}
}
diff --git a/dubbo-distribution/dubbo-all-shaded/pom.xml b/dubbo-distribution/dubbo-all-shaded/pom.xml
index 9221a5c1380..dd826febb3d 100644
--- a/dubbo-distribution/dubbo-all-shaded/pom.xml
+++ b/dubbo-distribution/dubbo-all-shaded/pom.xml
@@ -1,1359 +1,1022 @@
-
+ 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.
+ -->
- 4.0.0
-
- org.apache.dubbo
- dubbo-parent
- ${revision}
- ../../pom.xml
-
- dubbo-all-shaded
- jar
- dubbo-all-shaded
- The all in one project of dubbo with dependencies prone to conflict shaded
-
- false
-
-
-
-
- org.apache.dubbo
- dubbo-cluster
- ${project.version}
- compile
- true
-
+ 4.0.0
+
+ org.apache.dubbo
+ dubbo-parent
+ ${revision}
+ ../../pom.xml
+
+ dubbo-all-shaded
+ jar
+ dubbo-all-shaded
+ The all in one project of dubbo with dependencies prone to conflict shaded
+
+ false
+
+
+
+
+ org.apache.dubbo
+ dubbo-cluster
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-common
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-common
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-compatible
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-compatible
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-config-api
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-config-spring
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-config-api
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-config-spring
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-configcenter-zookeeper
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-configcenter-apollo
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-configcenter-nacos
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-configcenter-zookeeper
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-configcenter-apollo
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-configcenter-nacos
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-filter-cache
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-filter-validation
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-filter-cache
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-filter-validation
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-rest-jaxrs
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-rest-servlet
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-rest-spring
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-kubernetes
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-kubernetes
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-metadata-api
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metadata-report-zookeeper
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metadata-report-nacos
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metadata-report-redis
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metadata-definition-protobuf
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-metadata-api
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metadata-report-zookeeper
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metadata-report-nacos
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metadata-report-redis
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metadata-definition-protobuf
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-metrics-api
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metrics-default
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metrics-registry
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metrics-prometheus
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metrics-metadata
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-metrics-config-center
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-metrics-api
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metrics-default
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metrics-registry
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metrics-prometheus
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metrics-metadata
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-metrics-config-center
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-auth
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-qos-api
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-qos
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-security
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-reactive
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-auth
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-qos-api
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-qos
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-security
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-reactive
+ ${project.version}
+ compile
+ true
+
-
- org.apache.dubbo
- dubbo-spring-security
- ${project.version}
- compile
- true
-
+
+ org.apache.dubbo
+ dubbo-spring-security
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-registry-api
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-registry-multicast
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-registry-multiple
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-registry-nacos
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-registry-zookeeper
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-registry-api
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-registry-multicast
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-registry-multiple
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-registry-nacos
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-registry-zookeeper
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-remoting-api
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-remoting-http
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-remoting-netty
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-remoting-netty4
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-remoting-zookeeper
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-remoting-zookeeper-curator5
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-remoting-api
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-remoting-http
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-remoting-netty
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-remoting-netty4
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-remoting-zookeeper
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-remoting-zookeeper-curator5
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-rpc-api
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-rpc-dubbo
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-rpc-injvm
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-rpc-rest
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-rpc-api
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-rpc-dubbo
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-rpc-injvm
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-rpc-rest
+ ${project.version}
+ compile
+ true
+
-
- org.apache.dubbo
- dubbo-rpc-triple
- ${project.version}
- compile
- true
-
+
+ org.apache.dubbo
+ dubbo-rpc-triple
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-serialization-api
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-serialization-hessian2
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-serialization-fastjson2
- ${project.version}
- compile
- true
-
-
- org.apache.dubbo
- dubbo-serialization-jdk
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-serialization-api
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-serialization-hessian2
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-serialization-fastjson2
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-serialization-jdk
+ ${project.version}
+ compile
+ true
+
-
-
- org.apache.dubbo
- dubbo-xds
- ${project.version}
- compile
- true
-
+
+
+ org.apache.dubbo
+ dubbo-xds
+ ${project.version}
+ compile
+ true
+
-
-
- io.netty
- netty-all
- compile
- true
-
-
- org.springframework
- spring-context
-
-
- com.alibaba.spring
- spring-context-support
-
-
- org.javassist
- javassist
-
-
- org.yaml
- snakeyaml
-
-
- com.alibaba
- hessian-lite
-
-
- com.alibaba.fastjson2
- fastjson2
-
-
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
-
-
- package
-
- shade
-
-
- true
- true
- false
-
-
- org.apache.dubbo:dubbo-auth
- org.apache.dubbo:dubbo-cluster
- org.apache.dubbo:dubbo-common
- org.apache.dubbo:dubbo-compatible
- org.apache.dubbo:dubbo-config-api
- org.apache.dubbo:dubbo-config-spring
- org.apache.dubbo:dubbo-configcenter-apollo
- org.apache.dubbo:dubbo-configcenter-nacos
- org.apache.dubbo:dubbo-configcenter-zookeeper
- org.apache.dubbo:dubbo-filter-cache
- org.apache.dubbo:dubbo-filter-validation
- org.apache.dubbo:dubbo-metadata-api
- org.apache.dubbo:dubbo-metadata-definition-protobuf
- org.apache.dubbo:dubbo-metadata-report-nacos
- org.apache.dubbo:dubbo-metadata-report-redis
- org.apache.dubbo:dubbo-metadata-report-zookeeper
- org.apache.dubbo:dubbo-metrics-api
- org.apache.dubbo:dubbo-metrics-default
- org.apache.dubbo:dubbo-metrics-registry
- org.apache.dubbo:dubbo-metrics-metadata
- org.apache.dubbo:dubbo-metrics-config-center
- org.apache.dubbo:dubbo-metrics-prometheus
- org.apache.dubbo:dubbo-qos
- org.apache.dubbo:dubbo-qos-api
- org.apache.dubbo:dubbo-security
- org.apache.dubbo:dubbo-reactive
- org.apache.dubbo:dubbo-spring-security
- org.apache.dubbo:dubbo-registry-api
- org.apache.dubbo:dubbo-registry-multicast
- org.apache.dubbo:dubbo-registry-multiple
- org.apache.dubbo:dubbo-registry-nacos
- org.apache.dubbo:dubbo-registry-zookeeper
- org.apache.dubbo:dubbo-remoting-api
- org.apache.dubbo:dubbo-remoting-http
- org.apache.dubbo:dubbo-remoting-netty4
- org.apache.dubbo:dubbo-remoting-netty
- org.apache.dubbo:dubbo-remoting-zookeeper
- org.apache.dubbo:dubbo-remoting-zookeeper-curator5
- org.apache.dubbo:dubbo-rpc-api
- org.apache.dubbo:dubbo-rpc-dubbo
- org.apache.dubbo:dubbo-rpc-injvm
- org.apache.dubbo:dubbo-rpc-rest
- org.apache.dubbo:dubbo-rpc-triple
- org.apache.dubbo:dubbo-serialization-api
- org.apache.dubbo:dubbo-serialization-hessian2
- org.apache.dubbo:dubbo-serialization-fastjson2
- org.apache.dubbo:dubbo-serialization-jdk
- org.apache.dubbo:dubbo-kubernetes
- org.apache.dubbo:dubbo-xds
- io.netty:*
-
-
-
-
-
- META-INF/dubbo/internal/com.alibaba.dubbo.common.extension.ExtensionFactory
-
-
-
-
- META-INF/dubbo/internal/com.alibaba.dubbo.container.page.PageHandler
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.auth.spi.AccessKeyStorage
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.auth.spi.Authenticator
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.cache.CacheFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.compiler.Compiler
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.config.OrderedPropertiesProvider
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.context.ApplicationExt
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.context.ModuleExt
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.convert.Converter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.convert.multiple.MultiValueConverter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.deploy.ApplicationDeployListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.deploy.ModuleDeployListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionInjector
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionLoader
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.infra.InfraAdapter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.lang.ShutdownHookCallback
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.logger.LoggerAdapter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.serialize.MultipleSerialization
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.status.StatusChecker
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.status.reporter.FrameworkStatusReporter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.store.DataStore
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.ThreadPool
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.manager.ExecutorRepository
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.url.component.param.DynamicParamSource
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.config.ConfigInitializer
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.config.ConfigPostProcessor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.config.ServiceListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.config.bootstrap.DubboBootstrapStartStopListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.config.spring.context.DubboSpringInitCustomizer
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.config.spring.extension.SpringExtensionInjector
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataParamsFilter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.builder.TypeBuilder
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.rest.AnnotatedMethodParameterProcessor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.rest.ServiceRestMetadataResolver
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.report.MetadataReportFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.AnnotatedMethodParameterProcessor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.ServiceRestMetadataReader
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.monitor.MonitorFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.qos.api.BaseCommand
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.qos.probe.LivenessProbe
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.qos.probe.ReadinessProbe
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.qos.probe.StartupProbe
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.qos.permission.PermissionChecker
-
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.PenetrateAttachmentSelector
-
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.AddressListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.ProviderFirstParams
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryServiceListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.client.RegistryClusterIdentifier
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.ssl.CertProvider
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.client.migration.MigrationAddressComparator
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.client.migration.PreMigratingConditionChecker
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.integration.RegistryProtocolListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.xds.XdsCertificateSigner
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.filter.RestResponseInterceptor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.filter.RestRequestFilter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.filter.RestResponseFilter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.NoAnnotatedParameterRequestTagProcessor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.annotation.consumer.HttpConnectionPreBuildIntercept
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.annotation.param.parse.consumer.BaseConsumerParamParser
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.http.factory.RestClientFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.ChannelHandler
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.Codec
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.Codec2
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.Dispatcher
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.Transporter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.dubbo.ByteAccessor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.api.pu.PortUnificationTransporter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.api.connection.ConnectionManager
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.api.WireProtocol
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.exchange.Exchanger
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.http.HttpBinder
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.ExporterListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.HeaderFilter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.InvokerListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.PenetrateAttachmentSelector
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.ProxyFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.ZoneDetector
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.Cluster
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.ConfiguratorFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.LoadBalance
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.Merger
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.ProviderURLMergeProcessor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RuleConverter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.InvocationInterceptorBuilder
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.mesh.route.MeshEnvListenerFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.state.StateRouterFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.condition.matcher.pattern.ValuePattern
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.condition.matcher.ConditionMatcherFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.model.ApplicationInitListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.model.BuiltinServiceDetector
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.model.ScopeModelInitializer
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.injvm.ParamDeepCopyUtil
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.PathResolver
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.validation.Validation
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.ServiceInstanceNotificationCustomizer
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.compressor.Compressor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.compressor.DeCompressor
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metrics.service.MetricsService
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metrics.service.MetricsServiceExporter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metrics.report.MetricsReporterFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.event.ThreadPoolExhaustedListener
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.remoting.api.pu.PortUnificationTransporter
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.mesh.util.TracingContextProvider
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.ServiceRestMetadataResolver
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.executor.IsolationExecutorSupportFactory
-
-
-
-
- META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector
-
-
+
+
+ io.netty
+ netty-all
+ compile
+ true
+
+
+ org.springframework
+ spring-core
+
+
+ org.springframework
+ spring-beans
+
+
+ org.springframework
+ spring-context
+
+
+ com.alibaba.spring
+ spring-context-support
+
+
+ org.javassist
+ javassist
+
+
+ org.yaml
+ snakeyaml
+
+
+ com.alibaba
+ hessian-lite
+
+
+ com.alibaba.fastjson2
+ fastjson2
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+ package
+
+ shade
+
+
+ true
+ true
+ false
+
+
+ org.apache.dubbo:dubbo-auth
+ org.apache.dubbo:dubbo-cluster
+ org.apache.dubbo:dubbo-common
+ org.apache.dubbo:dubbo-compatible
+ org.apache.dubbo:dubbo-config-api
+ org.apache.dubbo:dubbo-config-spring
+ org.apache.dubbo:dubbo-configcenter-apollo
+ org.apache.dubbo:dubbo-configcenter-nacos
+ org.apache.dubbo:dubbo-configcenter-zookeeper
+ org.apache.dubbo:dubbo-filter-cache
+ org.apache.dubbo:dubbo-filter-validation
+ org.apache.dubbo:dubbo-metadata-api
+ org.apache.dubbo:dubbo-metadata-definition-protobuf
+ org.apache.dubbo:dubbo-metadata-report-nacos
+ org.apache.dubbo:dubbo-metadata-report-redis
+ org.apache.dubbo:dubbo-metadata-report-zookeeper
+ org.apache.dubbo:dubbo-metrics-api
+ org.apache.dubbo:dubbo-metrics-default
+ org.apache.dubbo:dubbo-metrics-registry
+ org.apache.dubbo:dubbo-metrics-metadata
+ org.apache.dubbo:dubbo-metrics-config-center
+ org.apache.dubbo:dubbo-metrics-prometheus
+ org.apache.dubbo:dubbo-qos
+ org.apache.dubbo:dubbo-qos-api
+ org.apache.dubbo:dubbo-security
+ org.apache.dubbo:dubbo-reactive
+ org.apache.dubbo:dubbo-spring-security
+ org.apache.dubbo:dubbo-registry-api
+ org.apache.dubbo:dubbo-registry-multicast
+ org.apache.dubbo:dubbo-registry-multiple
+ org.apache.dubbo:dubbo-registry-nacos
+ org.apache.dubbo:dubbo-registry-zookeeper
+ org.apache.dubbo:dubbo-remoting-api
+ org.apache.dubbo:dubbo-remoting-http
+ org.apache.dubbo:dubbo-remoting-netty4
+ org.apache.dubbo:dubbo-remoting-netty
+ org.apache.dubbo:dubbo-remoting-zookeeper
+ org.apache.dubbo:dubbo-remoting-zookeeper-curator5
+ org.apache.dubbo:dubbo-rpc-api
+ org.apache.dubbo:dubbo-rpc-dubbo
+ org.apache.dubbo:dubbo-rpc-injvm
+ org.apache.dubbo:dubbo-rpc-rest
+ org.apache.dubbo:dubbo-rpc-triple
+ org.apache.dubbo:dubbo-rest-jaxrs
+ org.apache.dubbo:dubbo-rest-servlet
+ org.apache.dubbo:dubbo-rest-spring
+ org.apache.dubbo:dubbo-serialization-api
+ org.apache.dubbo:dubbo-serialization-hessian2
+ org.apache.dubbo:dubbo-serialization-fastjson2
+ org.apache.dubbo:dubbo-serialization-jdk
+ org.apache.dubbo:dubbo-kubernetes
+ org.apache.dubbo:dubbo-xds
+ io.netty:*
+
+
+
+
+ META-INF/dubbo/internal/com.alibaba.dubbo.common.extension.ExtensionFactory
+
+
+ META-INF/dubbo/internal/com.alibaba.dubbo.container.page.PageHandler
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.auth.spi.AccessKeyStorage
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.auth.spi.Authenticator
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.cache.CacheFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.compiler.Compiler
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.config.OrderedPropertiesProvider
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.context.ApplicationExt
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.context.ModuleExt
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.convert.Converter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.convert.multiple.MultiValueConverter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.deploy.ApplicationDeployListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.deploy.ModuleDeployListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionInjector
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionLoader
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.infra.InfraAdapter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.lang.ShutdownHookCallback
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.logger.LoggerAdapter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.serialize.MultipleSerialization
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.status.StatusChecker
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.status.reporter.FrameworkStatusReporter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.store.DataStore
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.ThreadPool
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.manager.ExecutorRepository
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.url.component.param.DynamicParamSource
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.config.ConfigInitializer
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.config.ConfigPostProcessor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.config.ServiceListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.config.bootstrap.DubboBootstrapStartStopListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.config.spring.context.DubboSpringInitCustomizer
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.config.spring.extension.SpringExtensionInjector
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataParamsFilter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.builder.TypeBuilder
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.rest.AnnotatedMethodParameterProcessor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.rest.ServiceRestMetadataResolver
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.report.MetadataReportFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.AnnotatedMethodParameterProcessor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.ServiceRestMetadataReader
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.monitor.MonitorFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.qos.api.BaseCommand
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.qos.probe.LivenessProbe
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.qos.probe.ReadinessProbe
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.qos.probe.StartupProbe
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.qos.permission.PermissionChecker
+
-
-
- META-INF/dubbo/internal/org.apache.dubbo.spring.security.jackson.ObjectMapperCodecCustomer
-
-
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.PenetrateAttachmentSelector
+
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.annotation.param.parse.provider.BaseProviderParamParser
-
-
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.AddressListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.ProviderFirstParams
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryServiceListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.client.RegistryClusterIdentifier
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.ssl.CertProvider
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.client.migration.MigrationAddressComparator
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.client.migration.PreMigratingConditionChecker
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.integration.RegistryProtocolListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.xds.XdsCertificateSigner
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.filter.RestResponseInterceptor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.filter.RestRequestFilter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.filter.RestResponseFilter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.NoAnnotatedParameterRequestTagProcessor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.message.HttpMessageCodec
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.annotation.consumer.HttpConnectionPreBuildIntercept
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.annotation.param.parse.consumer.BaseConsumerParamParser
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.http.factory.RestClientFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.ChannelHandler
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.Codec
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.Codec2
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.Dispatcher
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.Transporter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.dubbo.ByteAccessor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.api.pu.PortUnificationTransporter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.api.connection.ConnectionManager
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.api.WireProtocol
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.exchange.Exchanger
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.http.HttpBinder
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.ExporterListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.HeaderFilter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.InvokerListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.PenetrateAttachmentSelector
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.ProxyFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.ZoneDetector
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.Cluster
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.ConfiguratorFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.LoadBalance
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.Merger
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.ProviderURLMergeProcessor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RuleConverter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.InvocationInterceptorBuilder
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.mesh.route.MeshEnvListenerFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.state.StateRouterFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.condition.matcher.pattern.ValuePattern
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.condition.matcher.ConditionMatcherFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.model.ApplicationInitListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.model.BuiltinServiceDetector
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.model.ScopeModelInitializer
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.injvm.ParamDeepCopyUtil
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.PathResolver
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.validation.Validation
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.ServiceInstanceNotificationCustomizer
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.compressor.Compressor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.compressor.DeCompressor
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.argument.ArgumentConverter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.argument.ArgumentResolver
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.filter.RestExtension
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.filter.RestExtensionAdapter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.mapping.RequestMappingResolver
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.route.RequestHandlerMapping
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.http12.message.HttpMessageAdapterFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metrics.service.MetricsService
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metrics.service.MetricsServiceExporter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metrics.report.MetricsReporterFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.event.ThreadPoolExhaustedListener
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.api.pu.PortUnificationTransporter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.mesh.util.TracingContextProvider
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.ServiceRestMetadataResolver
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.executor.IsolationExecutorSupportFactory
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.spring.security.jackson.ObjectMapperCodecCustomer
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.rest.annotation.param.parse.provider.BaseProviderParamParser
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.model.PackableMethodFactory
+
+
+
+
+ org.apache.dubbo:dubbo
+
+
+ com/**
+ org/**
+
+ META-INF/dubbo/**
+
+
+
+ io.netty:*
+
+ META-INF/**
+
+
+
+
+
+ io.netty
+ org.apache.dubbo.netty.shaded.io.netty
+
+
+
+
+
+
+
+
-
-
- META-INF/dubbo/internal/org.apache.dubbo.rpc.model.PackableMethodFactory
-
-
-
-
-
- org.apache.dubbo:dubbo
-
-
- com/**
- org/**
-
- META-INF/dubbo/**
-
-
-
- io.netty:*
-
- META-INF/**
-
-
-
-
-
- io.netty
- org.apache.dubbo.netty.shaded.io.netty
-
-
-
-
-
-
+
+
+ release
+
+
+
+ maven-javadoc-plugin
+ ${maven_javadoc_version}
+
+
+ attach-javadoc
+
+ jar
+
+
+ none
+
+
+
+
+ true
+
+ org.apache.dubbo:dubbo-*
+
+ public
+ UTF-8
+ UTF-8
+ UTF-8
+
+ http://docs.oracle.com/javase/7/docs/api
+
+
+
-
-
-
-
- release
-
-
-
- maven-javadoc-plugin
- ${maven_javadoc_version}
-
-
- attach-javadoc
-
- jar
-
-
- none
-
-
-
-
- true
-
- org.apache.dubbo:dubbo-*
-
- public
- UTF-8
- UTF-8
- UTF-8
-
- http://docs.oracle.com/javase/7/docs/api
-
-
-
-
-
-
-
+
+
+
diff --git a/dubbo-distribution/dubbo-all/pom.xml b/dubbo-distribution/dubbo-all/pom.xml
index 17e1ae2cb52..ee749b16724 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -284,6 +284,28 @@
true
+
+ org.apache.dubbo
+ dubbo-rest-jaxrs
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-rest-servlet
+ ${project.version}
+ compile
+ true
+
+
+ org.apache.dubbo
+ dubbo-rest-spring
+ ${project.version}
+ compile
+ true
+
+
org.apache.dubbo
@@ -448,6 +470,14 @@
+
+ org.springframework
+ spring-core
+
+
+ org.springframework
+ spring-beans
+ org.springframeworkspring-context
@@ -544,6 +574,9 @@
org.apache.dubbo:dubbo-rpc-injvmorg.apache.dubbo:dubbo-rpc-restorg.apache.dubbo:dubbo-rpc-triple
+ org.apache.dubbo:dubbo-rest-jaxrs
+ org.apache.dubbo:dubbo-rest-servlet
+ org.apache.dubbo:dubbo-rest-springorg.apache.dubbo:dubbo-serialization-apiorg.apache.dubbo:dubbo-serialization-hessian2org.apache.dubbo:dubbo-serialization-fastjson2
@@ -913,6 +946,27 @@
META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.compressor.DeCompressor
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.argument.ArgumentConverter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.argument.ArgumentResolver
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.filter.RestExtension
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.filter.RestExtensionAdapter
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.rest.mapping.RequestMappingResolver
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.route.RequestHandlerMapping
+
+
+ META-INF/dubbo/internal/org.apache.dubbo.remoting.http12.message.HttpMessageAdapterFactory
+ META-INF/dubbo/internal/org.apache.dubbo.metrics.service.MetricsService
@@ -980,7 +1034,7 @@
org.apache.dubbo:dubbo
-
+
com/**org/**
diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml
index 0edc520744b..4b0d3220c8a 100644
--- a/dubbo-distribution/dubbo-bom/pom.xml
+++ b/dubbo-distribution/dubbo-bom/pom.xml
@@ -334,6 +334,21 @@
dubbo-plugin-proxy-bytebuddy${project.version}
+
+ org.apache.dubbo
+ dubbo-rest-jaxrs
+ ${project.version}
+
+
+ org.apache.dubbo
+ dubbo-rest-servlet
+ ${project.version}
+
+
+ org.apache.dubbo
+ dubbo-rest-spring
+ ${project.version}
+
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/pom.xml b/dubbo-plugin/dubbo-rest-jaxrs/pom.xml
new file mode 100644
index 00000000000..26ab19d02f0
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/pom.xml
@@ -0,0 +1,102 @@
+
+
+
+ 4.0.0
+
+ org.apache.dubbo
+ dubbo-plugin
+ ${revision}
+ ../pom.xml
+
+
+ dubbo-rest-jaxrs
+
+
+
+ org.apache.dubbo
+ dubbo-rpc-triple
+ ${project.version}
+
+
+ javax.ws.rs
+ javax.ws.rs-api
+
+
+ org.jboss.resteasy
+ resteasy-jaxrs
+
+
+ *
+ *
+
+
+
+
+ org.apache.dubbo
+ dubbo-remoting-netty4
+ ${project.version}
+ test
+
+
+ javax.xml.bind
+ jaxb-api
+ test
+
+
+ org.glassfish.jaxb
+ jaxb-runtime
+ test
+
+
+ org.apache.dubbo
+ dubbo-rpc-rest
+ ${project.version}
+ test
+
+
+ javax.validation
+ validation-api
+
+
+ io.swagger
+ swagger-jaxrs
+
+
+ io.swagger
+ swagger-annotations
+
+
+ org.eclipse.jetty
+ jetty-servlet
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-core
+
+
+ org.eclipse.jetty
+ jetty-server
+
+
+ org.jboss.resteasy
+ resteasy-client
+
+
+
+
+
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/AbstractJaxrsArgumentResolver.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/AbstractJaxrsArgumentResolver.java
new file mode 100644
index 00000000000..e15ea565799
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/AbstractJaxrsArgumentResolver.java
@@ -0,0 +1,32 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.rpc.protocol.tri.rest.argument.AbstractAnnotationBaseArgumentResolver;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.AnnotationMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.NamedValueMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
+
+import java.lang.annotation.Annotation;
+
+public abstract class AbstractJaxrsArgumentResolver extends AbstractAnnotationBaseArgumentResolver {
+
+ @Override
+ protected NamedValueMeta createNamedValueMeta(ParameterMeta param, AnnotationMeta ann) {
+ return new NamedValueMeta(ann.getValue(), Helper.isRequired(param), Helper.defaultValue(param));
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/Annotations.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/Annotations.java
new file mode 100644
index 00000000000..42ddf4ccbd9
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/Annotations.java
@@ -0,0 +1,65 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.AnnotationEnum;
+
+import java.lang.annotation.Annotation;
+
+public enum Annotations implements AnnotationEnum {
+ Path,
+ HttpMethod,
+ Produces,
+ Consumes,
+ PathParam,
+ MatrixParam,
+ QueryParam,
+ HeaderParam,
+ CookieParam,
+ FormParam,
+ BeanParam,
+ Body("org.jboss.resteasy.annotations.Body"),
+ Form("org.jboss.resteasy.annotations.Form"),
+ Context("javax.ws.rs.core.Context"),
+ Suspended("javax.ws.rs.container.Suspended"),
+ DefaultValue,
+ Encoded,
+ Nonnull("javax.annotation.Nonnull");
+
+ private final String className;
+ private Class type;
+
+ Annotations(String className) {
+ this.className = className;
+ }
+
+ Annotations() {
+ className = "javax.ws.rs." + name();
+ }
+
+ public String className() {
+ return className;
+ }
+
+ @Override
+ public Class type() {
+ if (type == null) {
+ type = loadType();
+ }
+ return type;
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BeanArgumentBinder.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BeanArgumentBinder.java
new file mode 100644
index 00000000000..294875bd953
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BeanArgumentBinder.java
@@ -0,0 +1,280 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.Pair;
+import org.apache.dubbo.remoting.http12.HttpRequest;
+import org.apache.dubbo.remoting.http12.HttpResponse;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+import org.apache.dubbo.rpc.protocol.tri.rest.Messages;
+import org.apache.dubbo.rpc.protocol.tri.rest.RestException;
+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.mapping.meta.AnnotationMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.util.RestToolKit;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Parameter;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+final class BeanArgumentBinder {
+
+ private final ArgumentResolver argumentResolver;
+
+ private final Map, String>, BeanMeta> cache = CollectionUtils.newConcurrentHashMap();
+
+ BeanArgumentBinder(FrameworkModel frameworkModel) {
+ ScopeBeanFactory beanFactory = frameworkModel.getBeanFactory();
+ argumentResolver = beanFactory.getOrRegisterBean(CompositeArgumentResolver.class);
+ }
+
+ public Object bind(ParameterMeta parameter, HttpRequest request, HttpResponse response) {
+ try {
+ return resolveArgument(parameter, request, response);
+ } catch (Exception e) {
+ throw new RestException(Messages.ARGUMENT_BIND_ERROR, parameter.getName(), parameter.getType(), e);
+ }
+ }
+
+ private Object resolveArgument(ParameterMeta param, HttpRequest request, HttpResponse response) throws Exception {
+ AnnotationMeta> form = param.findAnnotation(Annotations.Form);
+ if (form != null || param.isHierarchyAnnotated(Annotations.BeanParam)) {
+ String prefix = form == null ? null : form.getString("prefix");
+ BeanMeta beanMeta = cache.computeIfAbsent(
+ Pair.of(param.getActualType(), prefix),
+ k -> new BeanMeta(param.getToolKit(), k.getValue(), k.getKey()));
+
+ ConstructorMeta constructor = beanMeta.constructor;
+ ParameterMeta[] parameters = constructor.parameters;
+ int len = parameters.length;
+ Object[] args = new Object[len];
+ for (int i = 0; i < len; i++) {
+ args[i] = resolveArgument(parameters[i], request, response);
+ }
+ Object bean = constructor.newInstance(args);
+
+ for (FieldMeta fieldMeta : beanMeta.fields) {
+ fieldMeta.set(bean, resolveArgument(fieldMeta, request, response));
+ }
+
+ for (SetMethodMeta methodMeta : beanMeta.methods) {
+ methodMeta.invoke(bean, resolveArgument(methodMeta, request, response));
+ }
+ return bean;
+ }
+
+ return argumentResolver.resolve(param, request, response);
+ }
+
+ private static class BeanMeta {
+
+ private final List fields = new ArrayList<>();
+ private final List methods = new ArrayList<>();
+ private final ConstructorMeta constructor;
+
+ BeanMeta(RestToolKit toolKit, String prefix, Class> type) {
+ constructor = resolveConstructor(toolKit, prefix, type);
+ resolveFieldAndMethod(toolKit, prefix, type);
+ }
+
+ private ConstructorMeta resolveConstructor(RestToolKit toolKit, String prefix, Class> type) {
+ Constructor>[] constructors = type.getConstructors();
+ Constructor> ct = null;
+ if (constructors.length == 1) {
+ ct = constructors[0];
+ } else {
+ try {
+ ct = type.getDeclaredConstructor();
+ } catch (NoSuchMethodException ignored) {
+ }
+ }
+ if (ct == null) {
+ throw new IllegalArgumentException("No available default constructor found in " + type);
+ }
+ return new ConstructorMeta(toolKit, prefix, ct);
+ }
+
+ private void resolveFieldAndMethod(RestToolKit toolKit, String prefix, Class> type) {
+ if (type == Object.class) {
+ return;
+ }
+ for (Field field : type.getDeclaredFields()) {
+ int modifiers = field.getModifiers();
+ if (Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers)) {
+ continue;
+ }
+ if (field.getAnnotations().length == 0) {
+ continue;
+ }
+ if (!field.isAccessible()) {
+ field.setAccessible(true);
+ }
+ fields.add(new FieldMeta(toolKit, prefix, field));
+ }
+ for (Method method : type.getDeclaredMethods()) {
+ if (method.getParameterCount() != 1) {
+ continue;
+ }
+ int modifiers = method.getModifiers();
+ if ((modifiers & (Modifier.PUBLIC | Modifier.ABSTRACT | Modifier.STATIC)) == Modifier.PUBLIC) {
+ Parameter parameter = method.getParameters()[0];
+ String name = method.getName();
+ if (name.length() > 3 && name.startsWith("set")) {
+ name = Character.toLowerCase(name.charAt(3)) + name.substring(4);
+ methods.add(new SetMethodMeta(toolKit, method, parameter, prefix, name));
+ }
+ }
+ }
+ resolveFieldAndMethod(toolKit, prefix, type.getSuperclass());
+ }
+ }
+
+ private static final class ConstructorMeta {
+
+ private final Constructor> constructor;
+ private final ConstructorParameterMeta[] parameters;
+
+ ConstructorMeta(RestToolKit toolKit, String prefix, Constructor> constructor) {
+ this.constructor = constructor;
+ parameters = initParameters(toolKit, prefix, constructor);
+ }
+
+ private ConstructorParameterMeta[] initParameters(RestToolKit toolKit, String prefix, Constructor> ct) {
+ Parameter[] cps = ct.getParameters();
+ int len = cps.length;
+ ConstructorParameterMeta[] parameters = new ConstructorParameterMeta[len];
+ for (int i = 0; i < len; i++) {
+ parameters[i] = new ConstructorParameterMeta(toolKit, cps[i], prefix);
+ }
+ return parameters;
+ }
+
+ Object newInstance(Object[] args) throws Exception {
+ return constructor.newInstance(args);
+ }
+ }
+
+ public static final class ConstructorParameterMeta extends ParameterMeta {
+
+ private final Parameter parameter;
+
+ ConstructorParameterMeta(RestToolKit toolKit, Parameter parameter, String prefix) {
+ super(toolKit, prefix, parameter.isNamePresent() ? parameter.getName() : null);
+ this.parameter = parameter;
+ }
+
+ @Override
+ protected AnnotatedElement getAnnotatedElement() {
+ return parameter;
+ }
+
+ @Override
+ public Class> getType() {
+ return parameter.getType();
+ }
+
+ @Override
+ public Type getGenericType() {
+ return parameter.getParameterizedType();
+ }
+
+ @Override
+ public String getDescription() {
+ return "ConstructorParameter{" + parameter + '}';
+ }
+ }
+
+ private static final class FieldMeta extends ParameterMeta {
+
+ private final Field field;
+
+ FieldMeta(RestToolKit toolKit, String prefix, Field field) {
+ super(toolKit, prefix, field.getName());
+ this.field = field;
+ }
+
+ @Override
+ public Class> getType() {
+ return field.getType();
+ }
+
+ @Override
+ public Type getGenericType() {
+ return field.getGenericType();
+ }
+
+ @Override
+ protected AnnotatedElement getAnnotatedElement() {
+ return field;
+ }
+
+ public void set(Object bean, Object value) throws Exception {
+ field.set(bean, value);
+ }
+
+ @Override
+ public String getDescription() {
+ return "FieldParameter{" + field + '}';
+ }
+ }
+
+ private static final class SetMethodMeta extends ParameterMeta {
+
+ private final Method method;
+ private final Parameter parameter;
+
+ SetMethodMeta(RestToolKit toolKit, Method method, Parameter parameter, String prefix, String name) {
+ super(toolKit, prefix, name);
+ this.method = method;
+ this.parameter = parameter;
+ }
+
+ @Override
+ public Class> getType() {
+ return parameter.getType();
+ }
+
+ @Override
+ public Type getGenericType() {
+ return parameter.getParameterizedType();
+ }
+
+ @Override
+ protected AnnotatedElement getAnnotatedElement() {
+ return parameter;
+ }
+
+ public void invoke(Object bean, Object value) throws Exception {
+ method.invoke(bean, value);
+ }
+
+ @Override
+ public String getDescription() {
+ return "SetMethodParameter{" + method + '}';
+ }
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BeanParamArgumentResolver.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BeanParamArgumentResolver.java
new file mode 100644
index 00000000000..7c59ec6d592
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BeanParamArgumentResolver.java
@@ -0,0 +1,44 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.remoting.http12.HttpRequest;
+import org.apache.dubbo.remoting.http12.HttpResponse;
+import org.apache.dubbo.rpc.protocol.tri.rest.argument.AnnotationBaseArgumentResolver;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.AnnotationMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
+
+import java.lang.annotation.Annotation;
+
+@Activate(onClass = "javax.ws.rs.BeanParam")
+public class BeanParamArgumentResolver implements AnnotationBaseArgumentResolver {
+
+ @Override
+ public Class accept() {
+ return Annotations.BeanParam.type();
+ }
+
+ @Override
+ public Object resolve(
+ ParameterMeta parameter,
+ AnnotationMeta annotation,
+ HttpRequest request,
+ HttpResponse response) {
+ return parameter.bind(request, response);
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BodyArgumentResolver.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BodyArgumentResolver.java
new file mode 100644
index 00000000000..5d461341033
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/BodyArgumentResolver.java
@@ -0,0 +1,56 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.io.StreamUtils;
+import org.apache.dubbo.remoting.http12.HttpRequest;
+import org.apache.dubbo.remoting.http12.HttpResponse;
+import org.apache.dubbo.rpc.protocol.tri.rest.RestException;
+import org.apache.dubbo.rpc.protocol.tri.rest.argument.AnnotationBaseArgumentResolver;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.AnnotationMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.util.RequestUtils;
+
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+
+@Activate(onClass = "org.jboss.resteasy.annotations.Body")
+public class BodyArgumentResolver implements AnnotationBaseArgumentResolver {
+
+ @Override
+ public Class accept() {
+ return Annotations.Body.type();
+ }
+
+ @Override
+ public Object resolve(
+ ParameterMeta parameter,
+ AnnotationMeta annotation,
+ HttpRequest request,
+ HttpResponse response) {
+ Class> type = parameter.getActualType();
+ if (type == byte[].class) {
+ try {
+ return StreamUtils.readBytes(request.inputStream());
+ } catch (IOException e) {
+ throw new RestException(e);
+ }
+ }
+ return RequestUtils.decodeBody(request, type);
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/CookieParamArgumentResolver.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/CookieParamArgumentResolver.java
new file mode 100644
index 00000000000..7f1b37b25a1
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/CookieParamArgumentResolver.java
@@ -0,0 +1,74 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.remoting.http12.HttpCookie;
+import org.apache.dubbo.remoting.http12.HttpRequest;
+import org.apache.dubbo.remoting.http12.HttpResponse;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.NamedValueMeta;
+
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Activate(onClass = "javax.ws.rs.CookieParam")
+public class CookieParamArgumentResolver extends AbstractJaxrsArgumentResolver {
+
+ @Override
+ public Class accept() {
+ return Annotations.CookieParam.type();
+ }
+
+ @Override
+ protected Object resolveValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ return request.cookie(meta.name());
+ }
+
+ @Override
+ protected Object resolveCollectionValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ Collection cookies = request.cookies();
+ if (cookies.isEmpty()) {
+ return Collections.emptyList();
+ }
+ String name = meta.name();
+ List result = new ArrayList<>(cookies.size());
+ for (HttpCookie cookie : cookies) {
+ if (name.equals(cookie.name())) {
+ result.add(cookie);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ protected Object resolveMapValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ Collection cookies = request.cookies();
+ if (cookies.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ Map> mapValue = CollectionUtils.newLinkedHashMap(cookies.size());
+ for (HttpCookie cookie : cookies) {
+ mapValue.computeIfAbsent(cookie.name(), k -> new ArrayList<>()).add(cookie);
+ }
+ return mapValue;
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FallbackArgumentResolver.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FallbackArgumentResolver.java
new file mode 100644
index 00000000000..0ecc924df79
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FallbackArgumentResolver.java
@@ -0,0 +1,89 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.io.StreamUtils;
+import org.apache.dubbo.remoting.http12.HttpRequest;
+import org.apache.dubbo.remoting.http12.HttpResponse;
+import org.apache.dubbo.rpc.protocol.tri.rest.RestConstants;
+import org.apache.dubbo.rpc.protocol.tri.rest.RestException;
+import org.apache.dubbo.rpc.protocol.tri.rest.argument.AbstractArgumentResolver;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.NamedValueMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.util.RequestUtils;
+import org.apache.dubbo.rpc.protocol.tri.rest.util.TypeUtils;
+
+import java.io.IOException;
+
+@Activate(order = Integer.MAX_VALUE - 10000, onClass = "javax.ws.rs.Path")
+public class FallbackArgumentResolver extends AbstractArgumentResolver {
+
+ @Override
+ public boolean accept(ParameterMeta param) {
+ return param.getToolKit().getDialect() == RestConstants.DIALECT_JAXRS;
+ }
+
+ @Override
+ protected NamedValueMeta createNamedValueMeta(ParameterMeta param) {
+ return new NamedValueMeta(param.isAnnotated(Annotations.Nonnull), Helper.defaultValue(param));
+ }
+
+ @Override
+ protected Object resolveValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ Object value = RequestUtils.decodeBody(request, meta.type());
+ if (value != null) {
+ return value;
+ }
+ if (meta.parameterMeta().isSimple()) {
+ return request.parameter(meta.name());
+ }
+ return null;
+ }
+
+ @Override
+ protected Object resolveCollectionValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ Class> type = meta.type();
+ if (type == byte[].class) {
+ try {
+ return StreamUtils.readBytes(request.inputStream());
+ } catch (IOException e) {
+ throw new RestException(e);
+ }
+ }
+ Object value = RequestUtils.decodeBody(request, meta.type());
+ if (value != null) {
+ return value;
+ }
+ if (TypeUtils.isSimpleProperty(meta.nestedType(0))) {
+ return request.parameterValues(meta.name());
+ }
+ return null;
+ }
+
+ @Override
+ protected Object resolveMapValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ Object value = RequestUtils.decodeBody(request, meta.type());
+ if (value != null) {
+ return value;
+ }
+ if (TypeUtils.isSimpleProperty(meta.nestedType(1))) {
+ return RequestUtils.getParametersMap(request);
+ }
+ return null;
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FormArgumentResolver.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FormArgumentResolver.java
new file mode 100644
index 00000000000..4f3678be5fa
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FormArgumentResolver.java
@@ -0,0 +1,43 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.remoting.http12.HttpRequest;
+import org.apache.dubbo.remoting.http12.HttpResponse;
+import org.apache.dubbo.rpc.protocol.tri.rest.argument.AnnotationBaseArgumentResolver;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.AnnotationMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
+
+import java.lang.annotation.Annotation;
+
+@Activate(onClass = "org.jboss.resteasy.annotations.Form")
+public class FormArgumentResolver implements AnnotationBaseArgumentResolver {
+ @Override
+ public Class accept() {
+ return Annotations.Form.type();
+ }
+
+ @Override
+ public Object resolve(
+ ParameterMeta parameter,
+ AnnotationMeta annotation,
+ HttpRequest request,
+ HttpResponse response) {
+ return parameter.bind(request, response);
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FormParamArgumentResolver.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FormParamArgumentResolver.java
new file mode 100644
index 00000000000..7ac1b2fcda0
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/FormParamArgumentResolver.java
@@ -0,0 +1,52 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.remoting.http12.HttpRequest;
+import org.apache.dubbo.remoting.http12.HttpResponse;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.NamedValueMeta;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * TODO: support nested values: (e.g., 'telephoneNumbers[0].countryCode' 'address[INVOICE].street')
+ */
+@Activate(onClass = "javax.ws.rs.FormParam")
+public class FormParamArgumentResolver extends AbstractJaxrsArgumentResolver {
+
+ @Override
+ public Class accept() {
+ return Annotations.FormParam.type();
+ }
+
+ @Override
+ protected Object resolveValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ return CollectionUtils.first(request.formParameterValues(getFullName(meta)));
+ }
+
+ @Override
+ protected Object resolveCollectionValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ return request.formParameterValues(getFullName(meta));
+ }
+
+ private String getFullName(NamedValueMeta meta) {
+ String prefix = meta.parameterMeta().getPrefix();
+ return prefix == null ? meta.name() : prefix + '.' + meta.name();
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/HeaderParamArgumentResolver.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/HeaderParamArgumentResolver.java
new file mode 100644
index 00000000000..8989c0ab062
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/HeaderParamArgumentResolver.java
@@ -0,0 +1,48 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.remoting.http12.HttpRequest;
+import org.apache.dubbo.remoting.http12.HttpResponse;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.NamedValueMeta;
+
+import java.lang.annotation.Annotation;
+
+@Activate(onClass = "javax.ws.rs.HeaderParam")
+public class HeaderParamArgumentResolver extends AbstractJaxrsArgumentResolver {
+
+ @Override
+ public Class accept() {
+ return Annotations.HeaderParam.type();
+ }
+
+ @Override
+ protected Object resolveValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ return request.header(meta.name());
+ }
+
+ @Override
+ protected Object resolveCollectionValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ return request.headerValues(meta.name());
+ }
+
+ @Override
+ protected Object resolveMapValue(NamedValueMeta meta, HttpRequest request, HttpResponse response) {
+ return request.headers();
+ }
+}
diff --git a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/Helper.java b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/Helper.java
new file mode 100644
index 00000000000..9abde6219ac
--- /dev/null
+++ b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/Helper.java
@@ -0,0 +1,85 @@
+/*
+ * 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.dubbo.rpc.protocol.tri.rest.support.jaxrs;
+
+import org.apache.dubbo.remoting.http12.HttpCookie;
+import org.apache.dubbo.remoting.http12.HttpResult;
+import org.apache.dubbo.remoting.http12.HttpUtils;
+import org.apache.dubbo.remoting.http12.message.DefaultHttpResult.Builder;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.AnnotationMeta;
+import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.NewCookie;
+import javax.ws.rs.core.Response;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public final class Helper {
+
+ private Helper() {}
+
+ public static boolean isRequired(ParameterMeta parameter) {
+ return parameter.isAnnotated(Annotations.Nonnull);
+ }
+
+ public static String defaultValue(ParameterMeta annotation) {
+ AnnotationMeta> meta = annotation.getAnnotation(Annotations.DefaultValue);
+ return meta == null ? null : meta.getValue();
+ }
+
+ public static HttpResult