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(() -> {

Reply via email to