JAX-RS 2.0 中 REST 的四种服务类型

使用 JAX-RS 创建 REST 服务/微服务 REST(表述性状态转移)是一种基于HTTP协议的架构风格,广泛用于构建可扩展的Web服务。JAX-RS(Java API for RESTful Web Services)是Java提供的标准API,通过注解简化了RESTful Web服务的开发。本文详细介绍了如何使用JAX-RS创建REST服务或微服务,包括项目设置、代码实现、部署和测试。首先,通过Maven创建项目并添加Jakarta EE依赖,然后配置应用服务器(如WildFly)。接着,创建JAX-RS应用类和资源类,使用注解定义端点和响应格式。 阅读详情

最近在学习 jersey 框架。他是 目前比较流行的 基于 JAX-RS 2.0 规范实现的 RESTful 框架。

我是跟着 《Java RESTful Web Service 实战》 一书 在学习。书中有些知识点,不太常用,但是比较重要,特写下次笔记已备忘。

概要

如下图:

  • 情况一:当不存在 Application 子类,也不存在 Servlet 子类时
  • 情况二:当不存在 Application 子类,但是存在 Servlet 子类时

  • 情况三:当存在 Application 子类,而且 Application 子类被 ApplicationPath 注解所修饰。

  • 情况四:当存在 Application 子类,但是没有被ApplicationPath 注解所修饰。

REST4种服务模式
此图来自于《Java RESTful Web Service 实战》

描述

  • 情况一

    以下xml代码是 servlet 容器的 web.xml 中的 去除 的子元素。

    当不存在 Application 子类,也不存在 Servlet 子类时,规范中定义,在这种情况下,为REST服务动态生成一个名为 javax.ws.rs.core.Application 的 Servlet 实例,并自动探测匹配资源。与此同时,需要根据Servlet的不同版本,在web.xml定义REST请求处理的Servlet为这个动态生成的Servlet.

    xml    <!-- Servlet 3.x 中的配置 -->
        <servlet>
            <servlet-name>javax.ws.rs.core.Application</servlet-name>
        </servlet>
        <servlet-mapping>
            <servlet-name>javax.ws.rs.core.Application</servlet-name>
            <url-pattern>/webapi/*</url-pattern>
        </servlet-mapping>
    
    xml<!-- Servlet 2.x 中的配置 -->
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
         <init-param>
             <param-name>jersey.config.server.provider.packages</param-name>
             <param-value>com.example</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
    

    通过 Servlet2.x 中 web.xml 的配置项,可以看出,jersey-container-servlet-core 不具备自动扫描资源类的功能。

    其中 org.glassfish.jersey.servlet.ServletContainer 是 jersey 中 Servlet的基类,它继承于 HttpServlet

  • 情况二

    当不存在 Application 子类,但是存在 Servlet 子类时。

    java// Servlet3.x 中 一个 Servlet 定义
    @WebServlet(
        initParam = @WenInitParam(name = "jersey.config.server.provider.packages", value="com.example"),
        urlPatterns="/webapi/*",
        loadOnStratup = 1
        )
    public class AirServlet extends ServletContainer {
    
    }
    

    以上是 基于 Servlet3.x 的 REST 服务。在 Servlet3.x 的场景下,可以省略 web.xml 文件。但是 Servlet 项目中如果没有 web.xml 的话,在使用 maven 发布war 的时候会报错,所以需要设置 maven-war-plugins 。

    xml    <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    
  • 情况三:
    当存在 Application 子类,而且 Application 子类被ApplicationPath注解所修饰。

    java@ApplicationPath("/webapi/*")
    public class AirApplication extends Application {
        @Override
        public Set<Class<?>> getClasses() {
            final Set<Class<?>> classes = new HashSet<Class<?>>();
            classes.add(BookResource.class);
            return classes;
        }
    }
    

    也可以使用,packages 方法 会扫描所有的资源类。

    java@ApplicationPath("/webapi/*")
    public class AirResourceConfig extends ResourceConfig {
        public AirResourceConfig() {
            packages("com.example");
        }
    }
    

    情况四:
    当存在 Application 子类,但是没有被 ApplicationPath 注解所修饰

    我们需要先 定义一个 Application 子类,已完成 Servlet 的配置。

    javapublic class AirApplication extends Application {
        @Override
        public Set<Class<?>> getClasses() {
            final Set<Class<?>> classes = new HashSet<Class<?>>();
            classes.add(BookResource.class);
            return classes;
        }
    }
    
    xml<servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.example.AirApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
    

    以上配置,可以生效与 Servlet2.x 版本中。我们可以 利用 Servlet3.x 的特性来简化这些设置。

    xml<servlet>
        <servlet-name>com.example.AirApplication</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.example.AirApplication</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
    

    以上就是 JAR-RS 规范中定义的四种 REST 服务的方式。

以上文字片段以及图片,部分来自于 《Java RESTful Web Service 实战》一书。如有版权侵犯,请联系邮箱[ychangsheng@gmail.com]。本人及时修改。

JAX-WS与JAX-RS区别是什么? 一、名称 JAX-WS:全称是JavaTM API forXML-Based Web Services JAX-RS :全称是 JavaTM API forRESTful Web Services 关于JAX-WS与JAX-RS两者是不同风格的SOA架构。前者以动词为中心,指定的是每次执行函数。而后者以名词为中心,每次执行的时候指的是资源。 阅读详情

相关推荐

JAX-RS实现REST接口的完整示例

Java API for RESTful Web Services (JAX-RS) 是一个Java编程语言的应用接口,用于开发RESTful Web服务。它被广泛应用于创建符合HTTP协议的API,是Java EE平台的一个组成部分,同时也得到了Java SE的支持。JAX-RS利用注解(Annotations)简化了RESTful服务的开发,使得开发者可以通过简单的注解来定义资源、方法以及路径映射,从而更专注于业务逻辑的实现。// 示例代码:JAX-RS基本注解使用@GET。

weixin_33610780的博客 898

RestEasy的入门与使用

文章目录RestEasy的入门与使用背景传统ServletJAX-RS和JSR为什么要看规范?简单解读JSR370ApplicationsResourcesProvidersRestEasy的基本使用建立Restful风格的JavaEE应用RestEasy是如何接管了应用呢?接受Restful风格的HTTP请求基本使用进阶使用全局异常的处理备注 RestEasy的入门与使用 大家在国内IT环境下,用的最多的应该就是SpringBoot,SpringMVC了。但是也有另外一派,就是使用完全实现JavaEE标准

本博客已迁移到 https://jacksparrow414.com 4735

掌握RESTful和JAX-RS 2.0构建Web服务

本文还有配套的精品资源,点击获取 简介:RESTful是一种强调客户端和服务器分离的网络应用设计方式,基于HTTP协议。JAX-RS 2.0是Java中实现RESTful服务的标准API,使得创建RESTful Web服务变得简单。本资料集包含Java开发者必备的JAX-RS 2.0规范的学习材料和源代码,详细介绍了新特性如路径参数、请求方法、请求与响应对象处理、查询参数、...

weixin_42388898的博客 540

javax.servlet.ServletException: Servlet with a name javax.ws.rs.core.Application is not available

气死我了!!!! 解决办法:web.xml里面添加: <servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> <servlet> <servl...

hch的博客 1027

事件相机(Event Camera)及相关研究简介——新一代相机?新的计算机视觉领域?

事件相机(Event Camera)及相关研究简介 事件相机是一个新型的类脑相机,是一个待开发的大领域。希望通过我的分享,能够有更多人来研究并将它更好地运用在我们的生活中~

Cyril的博客 5万+

802.1AS-2011_Gptp协议栈

GPTP(广义时钟同步协议,或IEEE 802.1AS)的基本功能是确保局域网中所有的时钟都同步,并提供时间信息。这种协议用于在局域网中进行同步和时间对齐,其目的是确保网络中各设备的时间一致性。

weixin_49041703的博客 2541

Java EE服务端学习(1)

一言不合就翻译官方文档。。。话说这文档翻译的也挺辛苦,转载请说明出处!! 什么是RESTful Web服务? RESTful Web服务是松散耦合的轻量级的web服务,特别是适用于为在网络上传播的客户端创建API。REST是客户端-服务器的架构,以通过请求和响应资源表述的传送为中心。在REST架构风格中,数据和功能被视为资源,并使用统一资源标识符(URI)访问,通常是web上的链接。资源由文档

majalis_C的博客 1115

告别过热焦虑:用Ansys Icepak给你的电子设备做个“水冷体检”(附冷板案例全流程)

本文详细介绍了如何利用Ansys Icepak进行电子设备水冷系统的热仿真分析,帮助工程师解决设备过热问题。通过冷板案例全流程演示,展示了从几何处理、材料设定到求解器设置和后处理的关键步骤,提升散热设计效率与准确性。

weixin_29299807的博客 439

使用WebSphere Application Server构建简单的,兼容JAX-RS 2.0的REST服务

RESTful Web服务的Java™API(JAX-RS)是接口和Java注释的集合,可简化服务器端REST应用程序的开发。 感谢JAX-RS,您可以通过注释类来响应特定的HTTP方法(例如GET或POST)和统一资源标识符(URI)模式来指定RESTful Web服务行为。 JAX-RS的当前版本是2.0版,并且是Java Platform Enterprise Edition(Java ...

cuxiong8996的博客 966

STM32F103C8T6心电采集实战:从PCB设计到上位机开发的完整指南(附TI杯开源资料)

本文详细介绍了基于STM32F103C8T6的心电采集系统开发全流程,从PCB设计到上位机开发,特别适合大学生电子设计大赛参赛者参考。内容涵盖硬件设计精要、软件算法优化及上位机开发技巧,并附TI杯开源资料,帮助开发者低成本实现医疗级心电信号采集。

kafka6courier的博客 193

Keil5安装包别乱下!手把手教你从官网精准下载C51/V960和MDK5,并完成2032年有效注册(避坑网络资源失效)

本文详细介绍了如何从Keil官网安全下载C51 V9.60和MDK5开发环境,并提供2032年有效注册的完整指南。通过验证安装包完整性、自定义安装路径和长期激活方案,帮助开发者避开网络资源陷阱,搭建稳定的STM32开发环境。

weixin_26886855的博客 529

JAX-RS 2.0 REST客户端编程实例

JAX-RS 2.0 REST客户端编程实例 2014/01/28 | 分类:基础技术,教程|0 条评论| 标签:JAX-RS,RESTFUL 分享到:3 本文由ImportNew-靳禹翻译自hascode。欢迎加入翻译小组。转载请见文末要求。 导读 JAX-RS2.0又称JSR339不仅定义了一套用于构建RESTful...

anyuta5577的博客 334

大唐杯历届省赛押题训练(6)

考试-TD-LTE无线网络设备介绍-TD-LTE网络架构一、单选题1TD-LTE的接入网E-UTRAN由下列哪些网元组成( )。0分/1分A、RNCB、BTSC、eNode BD、Node B提交答案:B正确答案:C考点TD-LTE网络架构解析暂无试题解析二、多选题1关于LTE网络整体结构,哪些说法是正确的( )0分/2分A、E-UTRAN用E-NodeB替代原有的RNC-NodeB结构B、E-NodeB间的接口为S1接口C、各网络节点之间的接口使用IP传输。

nimo观察者 633

jax_ws_Java EE 7 / JAX-RS 2.0 – REST上的CORS

jax_ws Java EE REST应用程序在所有服务器端资源和客户端UI都指向“ localhost”或127.0.0.1的开发机器上通常可以很好地使用。 但是,当涉及跨域部署时(当REST客户端不再与托管REST API的服务器位于同一域时),则需要一些解决方法。 本文是有关Java EE 7 / JAX-RS 2.0 REST API时如何使跨域或更广称为跨域资源共享(又称为CORS)的...

cunfen3485的博客 235

【常见开源库的二次开发】基于openssl的加密与解密——openssl认识与配置(一)

OpenSSL 是一个开源的软件库,它提供了一系列加密工具和协议,主要用于实现安全通信,如在网络上的数据传输。它支持多种加密算法,包括对称加密、非对称加密、散列函数、伪随机数生成器、数字签名、密钥交换以及证书管理等。

嵌入式技术开发 4160

【语音识别】基于MFCC特征实现说话人语音识别matlab源码

1 模型 采用能够反映人对语音的感知特性的Mel频率倒谱系数(MFCC)作为特征参数,以及为避免时间规整问题采用矢量量化技术开发的说话人识别系统.MFCC主要的是模拟人耳的听觉过程,相对于其它参数它对语音波形的变化不敏感,更加稳定,系统取得很好的识别结果,实验表明系统训练和识别的计算量和存储量都比较低. 2 部分代码 functionvarargout=Main(varargin) % MAIN M-file for Main.fig % MAIN, by itself...

qq_59747472的博客 848

REST service example using CXF 2.2, JAX-RS 1.0, JAXB and Spring

Filed under: java, spring — Tags: cxf, jaxb, jaxrs, maven, rest, roa, service, spring — Dhruba From:http://dhruba.name/2008/12/08/rest-service-example-using-cxf-22-jax-rs-10-jaxb-and-spring/Ba

Action 6393

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JAX-RS Analyzer 使用教程

JAX-RS Analyzer 使用教程 1. 项目介绍 JAX-RS Analyzer 是一个用于生成 JAX-RS 项目 REST 文档的工具。它通过字节码分析来生成项目中所有 JAX-RS 资源的概览。与传统的通过反射生成文档的工具不同,JAX-RS Analyzer 通过字节码分析获取更多信息,无需在 JAX-RS 资源方法上添加额外的注解。 主要特点: 字节码分析:通过字节码分析获取 ...

gitblog_01134的博客 965

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java EE 7 / JAX-RS 2.0 – REST上的CORS

Java EE REST应用程序通常在开箱即用的开发机器上运行良好,该开发机器上所有服务器端资源和客户端UI均指向“ localhost”或127.0.0.1。 但是,当涉及跨域部署时(当REST客户端不再与托管REST API的服务器位于同一域时),则需要一些解决方法。 本文是关于Java EE 7 / JAX-RS 2.0 REST API时如何使跨域或更广称为跨域资源共享(又称为COR...

最佳 Java 编程 205

嵌入式 Tomcat的 Jersey JAX-RS CRUD Rest Web服务

在本教程中,我们将学习如何使用Tomcat和 Jersey 创建 JAX-RS Get、POST、PUT 和 DELETE Rest Web 服务。 我们将建造什么? 我们正在构建一个简单的用户管理应用程序,它具有以下 CRUD Rest API。 为用户资源创建了以下五个 REST API(控制器处理程序方法) 。 在开始之前,我想给你一个 JAX-RS Java API 的概述。 什么是 JAX-RS? JAX-RS(用于 RESTful Web 服务的 Java API)是一...

allway2的博客 1014

JAX-RS2 REST 服务开发指南(一)

几年来,我们见证了从主机到 x86 农场、从重型方法到轻量级敏捷方法、从桌面和厚客户端到瘦、丰富和高度可用的 Web 应用程序以及无处不在的计算的几次革命和范式转变。随着技术领域向更小、更便携、更轻便的设备发展,以及这些设备在日常活动中被广泛使用,将计算从客户端机器推送到后端的需求变得更加突出。这也带来了在服务器和客户端之间开发具有近似实时或实时事件和数据传播的应用程序的机会和挑战;这正是 HTML 5 为开发者提供标准、API 和灵活性,以在 Web 应用程序中实现与厚客户端应用程序相同结果的地方。客户端

龙哥盟 716

jax-rs jax-ws_Google App Engine JAX-RS REST服务

jax-rs jax-ws 在本文中,您将学习如何使用JAX-RS参考实现(Jersey)创建REST服务并将其部署在Google AppEngine上。 先决条件 对于本教程,您将需要: 一个Google AppEngine帐户 Eclipse Galileo(3.5.x) 适用于Java的Google App Engine SDK 按照此处所述安装Ec...

最佳 Java 编程 179

JAX-RS规范的版本.实现.jar对应关系

Java API for RESTful Web Services JAX-RS: Java API for RESTful Web Services是一个Java编程语言的应用程序接口,支持按照 表象化状态转变 (REST)架构风格创建Web服务[1]. JAX-RS使用了Java SE 5引入的Java 标注来简化Web服务客户端和服务端的开发和部署。版本说明 名词解释 JCP:Java

Walter`s blog 2704

Apache CXF 3.0:JAX-RS 2.0和Bean验证1.1最终一起

即将发布的出色的Apache CXF框架3.0版 (当前处于里程碑2阶段)带来了许多有趣且有用的功能,越来越接近提供完整的JAX-RS 2.0支持。 Bean Validation 1.1的支持是我们中许多人期盼已久的功能之一:简单,简洁的模型可为您的REST服务层添加验证功能。 在这篇博客中,我们将研究如何在Apache CXF项目中配置Bean Validation 1.1 ,并讨论...

最佳 Java 编程 661
上一篇: 加速 SBT 下载依赖库的速度
下一篇: SAE Python urllib2因请求头字典键名为Unicode类型引发的异常问题
formyth
博客等级 码龄17年 9粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值