首页 > 其他分享 >Jersey框架相关

Jersey框架相关

时间:2023-08-21 22:11:35浏览次数:23  
标签:String 框架 class version jersey Path 相关 public Jersey

介绍

Jersey是一个REST框架,类似 SpringMVC,必须运行在Servlet容器中,如Tomcat或Jetty。

使用

在SpringBoot内嵌Tomcat容器中使用

<properties>
   <java.version>1.8</java.version>
   <jersey2.version>2.26</jersey2.version>
   <jaxrs.version>2.1</jaxrs.version>
</properties>
<dependencies>
    <!-- JAX-RS -->
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>${jaxrs.version}</version>
    </dependency>
    <!-- Jersey 2.26 -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

注意要使用JDK1.8,不能使用JDK11,使用jersey的高版本的话,jar包版本冲突,暂时没找到解决方案。

server:
  port: 9999
  servlet:
    context-path: /demo-jersey-server

spring:
  application:
    name: demo-jersey-server

配置SpringBoot启动类

@SpringBootApplication
public class JerseyServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(JerseyServerApplication.class, args);
    }

}
@Configuration
public class JerseyConfig {

    @Bean
    public ServletRegistrationBean<ServletContainer> jerseyServlet() {
        ServletRegistrationBean<ServletContainer> registrationBean = new ServletRegistrationBean<>();
        ResourceConfig resourceConfig = new ResourceConfig();
        resourceConfig.packages("com.imooc.demojerseyserver.jersey");
        registrationBean.setServlet(new ServletContainer(resourceConfig));
        registrationBean.addUrlMappings("/testJersey/*");
        return registrationBean;
    }
}

配置ServletContainer,这是一个Servlet,类似于SpringMVC中的DispatcherServlet。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GoodsInfo {

    private String goodsId;
    private String goodsName;
}
@Path("/jersey")
public class JerseyController {

    //返回字符串格式的数据
    @GET
    @Path("/hello")
    public String hello() {
        return "hello jersey";
    }

    //返回json格式的数据
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/hello2")
    public GoodsInfo goodsInfo() {
        return new GoodsInfo("001", "矿泉水");
    }
}

请求地址为

http://localhost:9999/demo-jersey-server/testJersey/jersey/hello2

在Jetty容器中使用

<dependency>
   <groupId>org.glassfish.jersey.containers</groupId>
   <artifactId>jersey-container-jetty-http</artifactId>
   <version>${jersey2.version}</version>
</dependency>

继承上面的maven依赖

@Path("/jersey")
public class JerseyController {

    @GET
    @Path("/hello")
    public String hello() {
        return "hello jersey";
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/hello2")
    public GoodsInfo goodsInfo() {
        return new GoodsInfo("001", "矿泉水");
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GoodsInfo {

    private String goodsId;
    private String goodsName;
}
public class TestJerseyServer {
    public static void main(String[] args) {
        ResourceConfig resourceConfig = new ResourceConfig();
        resourceConfig.packages("com.imooc.sourcecode2.jersey");
        JettyHttpContainerFactory.createServer(URI.create("http://localhost:9998/"), resourceConfig);
    }
}

请求地址为

http://localhost:9998/jersey/hello2

原理分析

扫描路由的流程

  1. 创建ServletContainer对象
  2. Servlet初始化,调用init()方法
  3. 创建WebComponent对象
  4. 根据ResourceConfig创建ApplicationHandler对象,ResourceConfig中保存着包扫描路径
  5. ApplicationHandler的initialize()方法
  6. RuntimeConfigConfigurator的init()方法,在这个过程中会调用RuntimeConfig的getClasses()方法,继续调用scanClasses()方法
  7. AnnotationAcceptingListener接收@Path注解和@Provider注解,使用PackageNamesScanner来扫描class,内部使用FileSchemeResourceFinderFactory和FileSchemeScanner来做具体扫描
  8. AnnotationAcceptingListener内部使用ASM框架来解析class,判断是否包含@Path等注解
  9. ResourceBagConfigurator的init()方法
  10. 根据扫描到的class创建Resource对象,在这个过程中会扫描方法,扫描@GET,@Path等注解
  11. 所有的路由数据最终保存在ServerBootstrapBag对象中,继续保存在ApplicationHandler的ServerRuntime字段中。

处理请求的流程

  1. ServletContainer的service()方法
  2. ApplicationHandler的handle()方法
  3. ServerRuntime的process()方法
  4. 通过Stages获取到Endpoint,实际类型为ResourceMethodInvoker,调用它的apply()方法,具体查找路由类和方法由RoutingStage来处理,将匹配到的handler放到RequestProcessingContext上下文中
  5. ResourceMethodDispatcher的dispatch()方法
  6. dispatcher分发器具体类型为TypeOutInvoker,内部通过反射执行方法

参考

Jersey 开发RESTful(七)Jersey快速入门

标签:String,框架,class,version,jersey,Path,相关,public,Jersey
From: https://www.cnblogs.com/strongmore/p/17131287.html

相关文章

  • 【学习笔记】优化建图相关(线段树优化,倍增优化)
    优化建图发现并没有人写得很详细的样子,那我也摆烂好惹点击查看目录目录前言线段树优化建图单点连区间区间连区间例题解题:倍增优化建图例题解题:前言众所周知,连边的时间复杂度一般是\(O(1)\),但,当连边的对象是一个连续的树上区间的时候,我们或许有更优的连边方式:优化建图。......
  • 新研究:Gartner 公有云成本管理框架
    2023年6月28日,Gartner出版了名为《BeyondFinOps:theGartnerFrameworkforPublicCloudFinancialManagement》的公有云成本管理框架,旨在帮助企业/组织应对公有云支出的挑战,同时抓住新机遇,推动更有效的IT使用。新框架包括了四个主要阶段:计划、跟踪、优化和赋能。每个阶段都......
  • ssh框架原理及流程
    1.hibernate工作原理:读取并解析配置文件读取并解析映射信息,创建sessionFactory打开session创建事务transaction持久化操作提交事务关闭session关闭sessionFactory   为什么使用:对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码是一个基于jd......
  • 基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布
    关于MobileIMSDKMobileIMSDK是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp,服务端基于Netty编写。工程开源地址是:1)Gitee码云地址:https://gitee.com/ja......
  • Hive相关学习
    1、服务启动2、Hive可视化客户端DataGrip软件需要自行下载,就能够享受Hive可视化啦!3、数据库相关SQL语句教学又学习了一些之前已经接触过、学过的SQL语句,这里就不再强调了。主要是学习如何将两台主机进行Hive关联,还有下载DataGrip软件。......
  • 个微框架实现功能
    登录创建新设备 获取登录二VM执行登录 注销登录消息消息回调 消息撤回 发送app类型消息 发送小程序发送CDN文件 发送CDN图片 发送CDN视频 发送emoji发送文件 发送图片 发送链接 发送消息 发送视频 发送语音朋友圈评论点赞 朋友圈功能操作 隐私设置 内容详情 查看......
  • 微信社群管理助手开发--基于GEWE框架
    当前市场上有各式各样的社群管理助手,但稍不留神就可能面临封号的风险,这将导致客户资源的流失,而重新获取客户需要耗费宝贵的时间。因此,此时亟需一个可靠的底层开发框架,以支持社群管理助手的稳定开发。此时gewe框架的重要性就出来了,提供了所有的社群助手功能,以下为部分功能。GEWE框架......
  • 路径相关
    下载的软件存放位置/var/cache/apt/archives安装后软件默认位置/usr/share可执行文件位置/usr/bin配置文件位置/etclib文件位置/usr/lib......
  • Blazor前后端框架Known-V1.2.13
    V1.2.13Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。Gitee:https://gitee.com/known/KnownGithub:https://github.com/known/Known概述基于C#和Blazor实现的快速开发框架,前后端分离,开箱即用。跨平台,单页应用,混合桌面应用,Web和桌面......
  • [完结25章]Java七大热门技术框架源码解析
    点击下载:[完结25章]Java七大热门技术框架源码解析提取码:ygnz《Java七大热门技术框架源码解析》已完结25章,任何框架都是有助于更快更好地开发软件解决方案的工具之一。框架的基本原理不必重新发明轮子。框架使开发人员的工作变得更轻松,并帮助他们专注于业务逻辑,而不必担心通用的......