This is an automated email from the ASF dual-hosted git repository.
albumenj 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 ca6909a497 Support no interface (#14639)
ca6909a497 is described below
commit ca6909a497666d03be250cae3fc9c8f789ec51cb
Author: Sean Yang <[email protected]>
AuthorDate: Fri Sep 6 16:41:50 2024 +0800
Support no interface (#14639)
Co-authored-by: Albumen Kevin <[email protected]>
---
.../dubbo/config/AbstractInterfaceConfig.java | 12 ++------
.../apache/dubbo/config/AbstractServiceConfig.java | 4 +--
.../org/apache/dubbo/config/ServiceConfigBase.java | 35 ++++++++++++----------
.../org/apache/dubbo/config/ServiceConfigTest.java | 14 +++++++++
.../org/apache/dubbo/config/url/UrlTestBase.java | 2 +-
.../config/spring/util/DubboAnnotationUtils.java | 4 ++-
.../tri/h12/AbstractServerTransportListener.java | 8 +----
7 files changed, 43 insertions(+), 36 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
index 368f8f56ec..4dd3503472 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
@@ -313,9 +313,7 @@ public abstract class AbstractInterfaceConfig extends
AbstractMethodConfig {
return;
}
- if (!interfaceClass.isInterface() && !canSkipInterfaceCheck()) {
- throw new IllegalStateException(interfaceName + " is not an
interface");
- }
+ checkInterface();
// Auto create MethodConfig/ArgumentConfig according to config
props
Map<String, String> configProperties =
subPropsConfiguration.getProperties();
@@ -377,13 +375,9 @@ public abstract class AbstractInterfaceConfig extends
AbstractMethodConfig {
/**
* it is used for skipping the check of interface since dubbo 3.2
- * rest protocol allow the service is implement class
- *
- * @return
+ * rest and triple protocol allow the service is implement class
*/
- protected boolean canSkipInterfaceCheck() {
- return false;
- }
+ protected void checkInterface() {}
protected boolean verifyMethodConfig(
MethodConfig methodConfig, Class<?> interfaceClass, boolean
ignoreInvalidMethodConfig) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractServiceConfig.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractServiceConfig.java
index 9965ffe6c1..dbd83e84c3 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractServiceConfig.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractServiceConfig.java
@@ -23,7 +23,7 @@ import org.apache.dubbo.rpc.model.ModuleModel;
import java.beans.Transient;
import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executor;
@@ -281,7 +281,7 @@ public abstract class AbstractServiceConfig extends
AbstractInterfaceConfig {
}
public void setProtocol(ProtocolConfig protocol) {
- setProtocols(new ArrayList<>(Arrays.asList(protocol)));
+ setProtocols(new ArrayList<>(Collections.singletonList(protocol)));
}
@Parameter(excluded = true)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
index a78ea257a9..f9fc435fe6 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
@@ -48,6 +48,7 @@ import static
org.apache.dubbo.common.constants.CommonConstants.DUBBO;
*
* @export
*/
+@SuppressWarnings({"rawtypes", "deprecation"})
public abstract class ServiceConfigBase<T> extends AbstractServiceConfig {
private static final long serialVersionUID = 3033787999037024738L;
@@ -109,6 +110,12 @@ public abstract class ServiceConfigBase<T> extends
AbstractServiceConfig {
setMethods(MethodConfig.constructMethodConfig(service.methods()));
}
+ @Override
+ public void setProtocols(List<? extends ProtocolConfig> protocols) {
+ super.setProtocols(protocols);
+ checkInterface();
+ }
+
@Override
protected void postProcessAfterScopeModelChanged(ScopeModel oldScopeModel,
ScopeModel newScopeModel) {
super.postProcessAfterScopeModelChanged(oldScopeModel, newScopeModel);
@@ -215,7 +222,7 @@ public abstract class ServiceConfigBase<T> extends
AbstractServiceConfig {
}
protected void completeCompoundConfigs() {
- super.completeCompoundConfigs(provider);
+ completeCompoundConfigs(provider);
if (provider != null) {
if (notHasSelfProtocolProperty()) {
setProtocols(provider.getProtocols());
@@ -269,7 +276,7 @@ public abstract class ServiceConfigBase<T> extends
AbstractServiceConfig {
}
try {
if (StringUtils.isNotEmpty(interfaceName)) {
- this.interfaceClass = Class.forName(
+ interfaceClass = Class.forName(
interfaceName, true,
Thread.currentThread().getContextClassLoader());
}
} catch (ClassNotFoundException t) {
@@ -279,7 +286,6 @@ public abstract class ServiceConfigBase<T> extends
AbstractServiceConfig {
}
/**
- * @param interfaceClass
* @see #setInterface(Class)
* @deprecated
*/
@@ -288,11 +294,8 @@ public abstract class ServiceConfigBase<T> extends
AbstractServiceConfig {
}
public void setInterface(Class<?> interfaceClass) {
- // rest protocol allow set impl class
- if (interfaceClass != null && !interfaceClass.isInterface() &&
!canSkipInterfaceCheck()) {
- throw new IllegalStateException("The interface class " +
interfaceClass + " is not a interface!");
- }
this.interfaceClass = interfaceClass;
+ checkInterface();
setInterface(interfaceClass == null ? null : interfaceClass.getName());
if (getInterfaceClassLoader() == null) {
setInterfaceClassLoader(interfaceClass == null ? null :
interfaceClass.getClassLoader());
@@ -300,24 +303,24 @@ public abstract class ServiceConfigBase<T> extends
AbstractServiceConfig {
}
@Override
- public boolean canSkipInterfaceCheck() {
- // for multipart protocol so for each contain
+ public void checkInterface() {
+ if (interfaceClass == null || interfaceClass.isInterface()) {
+ return;
+ }
List<ProtocolConfig> protocols = getProtocols();
-
- if (protocols == null) {
- return false;
+ if (CollectionUtils.isEmpty(protocols)) {
+ return;
}
-
for (ProtocolConfig protocol : protocols) {
String name = protocol.getName();
if (CommonConstants.TRIPLE.equals(name) &&
Boolean.TRUE.equals(protocol.isNoInterfaceSupport())) {
- return true;
+ return;
}
if (Constants.REST_PROTOCOL.equals(name)) {
- return true;
+ return;
}
}
- return false;
+ throw new IllegalStateException("The interface class " +
interfaceClass + " is not a interface!");
}
@Transient
diff --git
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
index 79a648d77b..924d0d14ca 100644
---
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
+++
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.config;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.config.api.DemoService;
import org.apache.dubbo.config.api.Greeting;
@@ -86,6 +87,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.withSettings;
class ServiceConfigTest {
+
private Protocol protocolDelegate = Mockito.mock(Protocol.class);
private Registry registryDelegate = Mockito.mock(Registry.class);
private Exporter exporter = Mockito.mock(Exporter.class);
@@ -261,7 +263,9 @@ class ServiceConfigTest {
@Test
void testInterface1() throws Exception {
Assertions.assertThrows(IllegalStateException.class, () -> {
+ ProtocolConfig protocolConfig = new
ProtocolConfig(CommonConstants.TRIPLE);
ServiceConfig<DemoService> service = new ServiceConfig<>();
+ service.setProtocol(protocolConfig);
service.setInterface(DemoServiceImpl.class);
});
}
@@ -273,6 +277,16 @@ class ServiceConfigTest {
assertThat(service.getInterface(),
equalTo(DemoService.class.getName()));
}
+ @Test
+ void testNoInterfaceSupport() throws Exception {
+ ProtocolConfig protocolConfig = new
ProtocolConfig(CommonConstants.TRIPLE);
+ protocolConfig.setNoInterfaceSupport(true);
+ ServiceConfig<DemoService> service = new ServiceConfig<>();
+ service.setProtocol(protocolConfig);
+ service.setInterface(DemoServiceImpl.class);
+ assertThat(service.getInterface(),
equalTo(DemoServiceImpl.class.getName()));
+ }
+
@Test
void testProvider() throws Exception {
ServiceConfig service = new ServiceConfig();
diff --git
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/url/UrlTestBase.java
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/url/UrlTestBase.java
index 868081c094..c0ffd4bda9 100644
---
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/url/UrlTestBase.java
+++
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/url/UrlTestBase.java
@@ -173,7 +173,7 @@ public class UrlTestBase {
servConf.setProvider(provConf);
servConf.setRef(demoService);
- servConf.setInterfaceClass(DemoService.class);
+ servConf.setInterface(DemoService.class);
methodConfForService.setName("sayName");
regConfForService.setAddress("127.0.0.1:9090");
diff --git
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboAnnotationUtils.java
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboAnnotationUtils.java
index a255c1042f..18bd120283 100644
---
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboAnnotationUtils.java
+++
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboAnnotationUtils.java
@@ -102,12 +102,14 @@ public class DubboAnnotationUtils {
Class<?>[] allInterfaces =
getAllInterfacesForClass(defaultInterfaceClass);
if (allInterfaces.length > 0) {
interfaceClass = allInterfaces[0];
+ } else {
+ interfaceClass = defaultInterfaceClass;
}
}
Assert.notNull(
interfaceClass, "@Service interfaceClass() or interfaceName()
or interface class must be present!");
- Assert.isTrue(interfaceClass.isInterface(), "The annotated type must
be an interface!");
+ // Assert.isTrue(interfaceClass.isInterface(), "The annotated type
must be an interface!");
return interfaceClass.getName();
}
diff --git
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/AbstractServerTransportListener.java
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/AbstractServerTransportListener.java
index a6f6b47917..871b9aa46b 100644
---
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/AbstractServerTransportListener.java
+++
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/AbstractServerTransportListener.java
@@ -163,13 +163,7 @@ public abstract class
AbstractServerTransportListener<HEADER extends RequestMeta
@Override
public final void onData(MESSAGE message) {
if (executor == null) {
- try {
- Throwable t = new NullPointerException("Executor not
initialized");
- logError(t);
- onError(message, t);
- } finally {
- onDataFinally(message);
- }
+ onDataFinally(message);
return;
}
executor.execute(() -> {