Dubbo的IllegalArgumentException问题的解决@Service interfaceClass() or interfaceName() or interface class

Love The Way You Lie 2023-09-30 20:01 6阅读 0赞

Dubbo的IllegalArgumentException问题的解决

原因:

  1. @Service interfaceClass() or interfaceName() or interface class must be present!
  2. //告诉你被Dubbo的@Service注解标注需要暴露的服务,必须实现接口
  3. //哪怕没有必要用接口你都得抽象出来一个接口

异常信息

  1. java.lang.IllegalArgumentException: @Service interfaceClass() or interfaceName() or interface class must be present!
  2. at org.springframework.util.Assert.notNull(Assert.java:198) ~[spring-core-5.1.10.RELEASE.jar:5.1.10.RELEASE]
  3. at org.apache.dubbo.config.spring.util.AnnotationUtils.resolveServiceInterfaceClass(AnnotationUtils.java:153) ~[dubbo-2.7.3.jar:2.7.3]
  4. at org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor.registerServiceBean(ServiceAnnotationBeanPostProcessor.java:270) ~[dubbo-2.7.3.jar:2.7.3]

异常信息: @Service interfaceClass() or interfaceName() or interface class must be present!
说的是dobbo提供的服务的类必须实现接口。但是下面的堆栈异常中有没有打印出来有问题的异常的类的信息, 最后还是我一个个检查dubbo服务发现问题。

问题原因:

dubbo提供服务的类必须直接实现接口, 间接继承实现接口不行

重现问题

接口

  1. public interface TestService {
  2. String test();
  3. }

spring容器中实现类

  1. import com.souche.intention.dubbo.service.TestService;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class TestServiceImpl implements TestService {
  5. @Override
  6. public String test() {
  7. return "test";
  8. }
  9. }

提供的dubbo服务

  1. @com.alibaba.dubbo.config.annotation.Service
  2. public class DubboTestService extends TestServiceImpl {
  3. }

启动服务后果然报了同样的错误。

因为我图方便, 直接集成了spring中的bean类,然后来发布dubbo服务,这样我可以共用业务代码,所以导致了这个问题

解决办法

将dubbo服务类改成下面这样既集成业务类, 也实现对应接口就可以了

  1. @com.alibaba.dubbo.config.annotation.Service
  2. public class DubboTestService extends TestServiceImpl implements TestService{
  3. }

改好后启动项目. 启动后在注册中心找到了注册的服务TestService。 问题解决

思考

java中类可以继承多个接口, 如果dubbo服务的类直接继承了多个接口,
是否会每个接口的方法都会注册。 经过验证确实如此

发表评论

表情:
评论列表 (有 0 条评论,6人围观)

还没有评论,来说两句吧...

相关阅读