`
沧海一小粟
  • 浏览: 25219 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dubbox rest

阅读更多
问题描述
今天在使用dubbox的时候,在启动服务的时候报出一个错误,导致应用无法启动,错误的提示信息为:
Initialization of bean failed; nested exception is java.lang.RuntimeException: RESTEASY003130: Class is not a root resource. It, or one of its interfaces must be annotated with @Path

dubbox是在dubbo的基础上进行了restFul的扩展,使用了JAX-RS的扩展,因此可以支持restFul的调用,默认的调用方式应该为:

Interface:

@Path("interface/doSomething")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface TestService {

    @POST
    @Path("run")
    boolean test(TestDTO dto);
}

Interface Implements:

@Service
public class TestServiceImpl implements TestService {

    @Override
    public boolean test(TestDTO dto) {
        //doSomething.......
    }
}

由于dubbox是基于dubbo实现的,当我们有某些方法不想再提供restFul的接口时,只是提供dubbo的调用,该怎么做呢?

于是我想当然的这么做了:


public interface TestService {

    boolean test(TestDTO dto);
}

我把interface中的JAX-RS的注解去除了,这样就只是提供dubbo的调用方式,而不提供restFul的调用了,然后当我启动项目的时候,就报了上面的错误……

问题原因
找了好多资料,找到了原因所在,因为dubbox支持JAX-RS,因此加入相应的Jar文件,其中就有resteasy,在其中的一个类ResourceMethodRegistry.java 中的addResourceFactory()方法,找到了问题原因:

/**
    * ResourceFactory.getScannableClass() defines what class should be scanned
    * for JAX-RS annotations.    The class and any implemented interfaces are scanned for annotations.
    *
    * @param ref
    * @param base base URI path for any resources provided by the factory, in addition to rootPath
    */
   public void addResourceFactory(ResourceFactory ref, String base)
   {
      Class<?> clazz = ref.getScannableClass();
      Class restful = GetRestful.getRootResourceClass(clazz);
      if (restful == null)
      {
         String msg = Messages.MESSAGES.classIsNotRootResource(clazz.getName());
         for (Class intf : clazz.getInterfaces())
         {
            msg += " " + intf.getName();
         }
         throw new RuntimeException(msg);
      }
      addResourceFactory(ref, base, restful);
   }

可以看到ResourceFactory.getScannableClass()定义了扫描哪些class文件,进入看一下具体的实现:

public class DubboResourceFactory implements ResourceFactory {

    private Object resourceInstance;
    private Class scannableClass;

    public DubboResourceFactory(Object resourceInstance, Class scannableClass) {
        this.resourceInstance = resourceInstance;
        this.scannableClass = scannableClass;
    }

    public Class<?> getScannableClass() {
        return scannableClass;
    }
}   

这里只给出部分源码,从此可以看出scannableClass是由dubbo注解的class,因此可以明白其报错的原因,JAX-RS会扫描被dubbo注解的class实现的interface,由于interface没有注解@Path,因此抛出了异常。

总结
使用dubbox后,提供dubbo服务的类必须注解@Path,即使该类中没有提供restFul的调用,否则会报出”Class is not a root resource”的异常,那我们有的类中的确没有方法需要提供restFul调用的时候该怎么办呢?可以在方法上不加任何注解,这样做的话只可以进行dubbo方式的调用

@Path("interface/doSomething")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface TestService {

    boolean test(TestDTO dto);
}


ps:本文为转载 自 wtopps的专栏,没有它义,收藏好文!
分享到:
评论

相关推荐

    Dubbox Rest

    jfinal 与dubbox 和 rest的 简单列子,不过jfinal 在其中使用的比较少,大多是基于java写的,dubbox 则是在 dubbo的基础上进行的扩展,运行示例的话,必须要有 dubbo admin的管理服务和zookeeper 服务。注意 这是个...

    dubbox 2.8.4 rest调用

    【标题】"dubbox 2.8.4 rest调用" 涉及到的是一个基于当当网开源框架dubbox实现RESTful API调用的项目实例。dubbox是Dubbo的一个分支,它在原Dubbo的基础上增加了更多的功能,包括对RESTful服务的支持。REST...

    gateway-dubbox:服务网关集成dubbox rest服务

    网关系统目的我们服务框架使用的是dubbox(这个不用再多描述了),内部系统调用使用的是dubbo协议;而对于前端提供服务则使用rest协议。前端应用面临许多rest服务,为了解决调用的统一,所以需要一个网关系统。为什么...

    Spring+dubbox+rest风格整合demo

    Spring整合dubbox框架编写rest风格,项目使用maven构建,需要编译dubbo-2.8.4到本地的maven资源仓库,然后使用当前代码测试,不需要相应的web容器,将浏览器作为一个客户端访问URL。

    dubbox框架源码和使用实例

    4. **协议(Protocol)**:Dubbox 支持多种通信协议,如 HTTP、Hessian、RMI 等,其中最常用的是基于 HTTP 的 REST 和基于二进制序列化的 Dubbo 协议。 5. **监控中心(Monitor)**:监控中心可以收集服务的调用...

    dubbo-2.8.4

    dubbo dubbox rest请求开。。。。。。。。。。。。。。。。。。。

    高级小知识点

    文中提到的Dubbox REST是Dubbo的一个扩展,实现了RESTful风格的服务调用,增强了服务的可访问性。 EasyUI是一个基于jQuery的UI组件库,提供了丰富的前端界面元素。在EasyUI中,textarea控件用于输入多行文本,但...

    dubbox2.8.4

    dubbox在Dubbo的基础上增加了如REST支持、Zookeeper注册中心、Feign客户端等新特性,使得它更适用于现代微服务架构。 【压缩包子文件的文件名称列表】中的"WEB-INF"和"META-INF"是Java Web应用的标准目录结构。其中...

    Dubbox 2.8.4相关jar包

    在本压缩包文件"Dubbox2.8.4关键jar包"中,包含了两个重要的jar包,即dubbo-2.8.4.jar和dubbo-rpc-rest-2.8.4.jar,它们是实现Dubbo支持REST服务开发的核心组件。 1. **Dubbo-2.8.4.jar** Dubbo是阿里巴巴开源的...

    dubbox2.8.4.rar

    2. **RPC 协议**:Dubbox 基于 Apache Dubbo 实现,支持多种远程调用协议,如基于 HTTP 的 REST、基于二进制的 Hessian 和 Burlap,以及基于 Java RMI 的 JMS 等。其中,最常用的是基于 TCP 的Dubbo 协议,它提供了...

    dubbox + springmvc 2017整合最新版

    dubbox是阿里巴巴开源的一个基于Java的RPC框架,它在dubbo的基础上增加了更多的特性,如REST支持、Hessian2协议等。而Spring MVC则是Spring框架的一部分,专门用于构建Web应用程序,提供了模型-视图-控制器(MVC)...

    dubbox介绍

    Dubbox引入了对REST风格远程调用的支持,利用成熟的JBoss RestEasy框架实现了HTTP+JSON/XML格式的数据交换,大大简化了跨语言通信的过程,同时也降低了企业内部或对外提供服务时的开发难度。这一特性对于当前流行的...

    dubbox 2.8.4

    《Dubbox 2.8.4:构建高性能微服务架构的关键组件》 Dubbox,作为阿里巴巴开源的一款基于Java的RPC框架,是Dubbo的增强版,它在原版基础上提供了更多的特性和优化,以适应更广泛的开发需求。本文将深入探讨在JDK...

    dubbox2.84

    Dubbox支持多种通信协议,如HTTP、REST、Hessian2、RMI等,这使得服务调用方式多样,能够适应不同的应用场景。此外,Dubbox还提供了动态配置中心,允许服务的注册、发现、调用和监控等功能,增强了服务的可扩展性和...

    dubbox服务例子

    5. **通信协议**:Dubbox 支持多种通信协议,如 HTTP、REST、Dubbo 协议等,以适应不同的应用场景。 综上所述,"dubbox服务例子" 是一个涵盖了服务提供者和服务消费者的实例,通过这两个角色的交互,我们可以学习...

    dubbox-master.zip 最新的2018.0706

    6. **协议支持**:除了默认的 Dubbo 协议,Dubbox 还支持 HTTP、REST、Hessian、RMI 等多种通信协议,方便与其他语言的服务进行交互。 7. **API 易用性**:Dubbox 提供了简单的 API 接口,使得开发者能够快速地定义...

    此包是dubbox所需要以及tomcat服务器的包

    `dubbox`是阿里巴巴开源的一个基于Java的RPC框架,它继承自Dubbo,并加入了更多的扩展功能,如REST支持、Zookeeper注册中心等,使得服务调用变得更加灵活和便捷。而`Tomcat`则是一款广泛使用的轻量级应用服务器,...

    dubbox-dubbox-2.8.4 源码

    Dubbox支持多种通信协议,如HTTP、REST、Dubbo、Hessian等,其中Dubbo协议是默认且高效的选项。源码中的`Protocol`接口定义了服务的暴露和引用方法,如`refer`和`export`。同时,Dubbox支持多种序列化方式,如Java...

    dubbox2.5.1-2.8.4包集合

    1. **REST支持**:Dubbox增加了对RESTful API的支持,使得服务可以通过HTTP协议暴露,方便了微服务间的跨语言调用。 2. **Zookeeper集成**:Dubbox默认集成了Zookeeper作为服务注册中心,同时也支持其他注册中心如...

Global site tag (gtag.js) - Google Analytics