微服务系列文章之 Springboot集成Jersey

Spring boot整合Jersey 一:介绍     Jersey是jax-rs实现。jax-rs是基于rest的web服务的Java API。Jersey RESTful web服务是SUN Microsystems提供的开放源码。用Jersey 2来创建RESTful web服务。我们将在这里讨论jax-rs API,它将用于创建Jersey RESTful web服务和Jersey客户端,然后我们将为Jersey RES 阅读详情

​ Springboot支持Jersey1.x和Jersey2.x,我们这里只介绍Springboot对Jersey2.x的支持。springboot对jersey的集成非常简单。

​ 项目结构:

 

 

 1、引入Springboot对Jersey的starter包

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2、配置Jersey配置对象

​ Springboot需要对Jersey的配置对象,有三种配置方式:

  1. 创建一个自定义的ResourceConfig
  2. 返回一个ResourceConfig类型的@Bean
  3. 配置一组ResourceConfigCustomizer对象

我们分别测试一下这三种配置方式。

实体类 User.java

package com.example.springbootjersey2.bean;

import org.springframework.stereotype.Component;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;

@Component
@XmlRootElement(name = "user")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    private String id;
    private String name;
    private String profession;

    public String getId() {
        return id;
    }

    @XmlElement
    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    @XmlElement
    public void setName(String name) {
        this.name = name;
    }

    public String getProfession() {
        return profession;
    }

    @XmlElement
    public void setProfession(String profession) {
        this.profession = profession;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", profession='" + profession + '\'' +
                '}';
    }
}

业务服务类  UserService.java

package com.example.springbootjersey2.service;


import com.example.springbootjersey2.bean.User;
import com.example.springbootjersey2.dao.UserDao;
import org.springframework.stereotype.Service;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.List;

@Path("/UserService")
@Service
public class UserService {

    @Path("/users")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<User> getUsers() {
        System.out.println("success");
        UserDao dao = new UserDao();
        return dao.getAllUsers();
    }
}

数据访问 UserDao.java

package com.example.springbootjersey2.dao;

import com.example.springbootjersey2.bean.User;
import org.springframework.stereotype.Repository;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

@Repository
public class UserDao{

    public List<User> getAllUsers() {
        List<User> userList;
        File file = new File("Users.dat");
        if (!file.exists()) {
            User user = new User();
            user.setId("1");
            user.setName("Tom");
            user.setProfession("Student");
            userList = new ArrayList<>();
            userList.add(user);
            writeUserList(userList, file);
        } else {
            userList = readUserList(file);
        }
        return userList;
    }


    /**
     * 序列化
     *
     * @param userList
     * @param file
     */
    private void writeUserList(List<User> userList, File file) {
        ObjectOutputStream oos = null;
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(userList);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    /**
     * 反序列化
     *
     * @param file
     * @return
     */
    @SuppressWarnings("unchecked")
    private List<User> readUserList(File file) {
        List<User> userList = null;
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        try {
            fis = new FileInputStream(file);
            ois = new ObjectInputStream(fis);
            userList = (List<User>) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return userList;
    }
}

启动类

package com.example.springbootjersey2;

import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class RestfulDemoApplication  {

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

   
}

第1种方式:创建一个自定义的ResourceConfig

package com.example.springbootjersey2.config;


import com.example.springbootjersey2.service.UserService;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.stereotype.Component;

@Component
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(UserService.class);
    }
}

只需要保证JerseyConfig在Application类能够扫描的包下即可。

发送测试请求:http://localhost:8080/UserService/users

 

注意:

  • Springboot默认把Jersey的根路径映射在/*上的;这个可以通过几种方式来配置,对于自定义的ResourceConfig方式来说,只需要在类上面添加一个@ApplicationPath注解即可:
@Component
@ApplicationPath("webapi")
public class JerseyConfig extends ResourceConfig {

​ 此时测试地址变为:http://localhost:8080/webapi/UserService/users

第2种方式:ResourceConfig类型的@Bean

 

 

​ 但是在这种情况下,想要配置Jersey的基础路径,就需要在application.properties文件中配置一个

spring.jersey.application-path=webapi

第3种方式: 使用ResourceConfigCustomizer

@Component
public class MyResourceConfigCustomizer implements ResourceConfigCustomizer {
    @Override
    public void customize(ResourceConfig config) {
        config.register(UserService.class);
    }
}

该接口很简单,传入一个ResourceConfig实例,我们就可以针对这个实例进行相关配置。但是要让这个传入的config生效,我们还需要在RestfulDemoApplication类中提供一个基础的ResourceConfig类即可:

@SpringBootApplication
public class RestfulDemoApplication  {

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

    @Bean
    public ResourceConfig resourceConfig() {
        ResourceConfig config = new ResourceConfig();
       
        return config;
    }
}

​ 这种方式对比第二种方式的好处在于,我们可以把资源类的注册,过滤器,拦截器,Entity Provider,Feature等不同类型的组件注册从主类中分开,在代码管理上会更加清晰。

 

2024年Java最全SpringBoot源码分析之SpringApplication构造方法核心源码分析,深入浅出 既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。 阅读详情

相关推荐

Spring Boot进阶(76):使用Spring Boot和Jersey打造高效 RESTful API

本文将会介绍如何使用Spring Boot和Jersey来构建高效的RESTful API。首先,我们将会了解RESTful API的概念和特点。接着,我们将介绍如何配置Jersey和Spring Boot,以及如何使用Jersey提供RESTful服务。最后,我们将提供完整的代码和测试用例,并进行总结和展望。

**My Coding Family** 1910

SpringBoot+elasticsearch+JerseyRESTful +redis博客系统

包含技术Linux、Redis、spring boot、文件上传下载、FreeMarker、thymeleaf、spring jdbc、Spring Data JPA、 MyBatis、 Mybatis Generator逆向生成、CKEditor、AJAX异步上传文件、Jersey实现应用服务器和文件服务器分离、Elasticsearch

springboot项目实战-Jersey Restful与Spring Boot集成

在目前的企业级开发中,从开发效率的角度来考虑,通常会选择使用前后端分离的开发形式。后端提供API接口,前端负责对接口进行调用,实现数据的返回和显示。前后端交互的一个重要工具是API,而Restful API是API的一种指导性设计思想,能让后端人员设计出更加优雅的API。本节介绍Restful API的概念和构建方式。

虾米大王的学习历程 883

spring-boot-starter-jersey的使用

jersey与resteasy一样都是JAX-RS即Java API for RESTful Web Services标准的实现,spring-boot-starter-jersey提供了对Jersey RESTful Web服务框架的支持,能够让我们轻松的构建RESTful Web工程。 新建工程 <groupId>com.wl.jersey</groupId> &...

wl的博客 5762

构建基于SpringBoot与Jersey的微服务应用框架

SpringBoot是一种开箱即用的Java开发框架,它遵循约定优于配置的原则,极大地简化了Spring应用的配置和部署过程。SpringBoot能够自动配置Spring应用,使得开发者能够专注于业务逻辑的实现。Jersey是一个开源的RESTful Web服务框架,它是Java EE的一部分,广泛用于开发RESTful服务。Jersey框架的特点包括性能优异、易于使用和扩展、遵循JAX-RS规范以及强大的社区支持。

weixin_28809949的博客 808

ffmpeg(一) ffmpeg+QT开发环境搭建

(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中)

小道士写程序 8203

boot jersey_Jersey和Spring Boot入门

boot jersey 除了许多新功能,Spring Boot 1.2还带来了Jersey支持。 这是吸引喜欢标准方法的开发人员的重要一步,因为他们现在可以使用JAX-RS规范构建RESTful API,并将其轻松部署到Tomcat或任何其他Spring's Boot支持的容器中。 带有Spring平台的Jersey可以在mico服务的开发中发挥重要作用。 在本文中,我将演示如何使用Sprin...

最佳 Java 编程 328

华硕笔记本+Ubuntu 20.04:用cpupower解决Intel CPU频率上不去/功耗墙问题实战

本文详细介绍了在华硕笔记本Ubuntu 20.04系统下使用cpupower工具解决Intel CPU频率受限和功耗墙问题的实战方法。通过禁用Intel P-State驱动、配置userspace模式以及高级调优技巧,帮助用户突破性能瓶颈,提升编译和计算效率。

weixin_42561476的博客 521

spring boot 2.1.x整合jersey遇到的坑

由于最近的开发需要用到这个框架,所以打算重新学习下,但是spring boot的版本升级了,导致了依赖方面一些问题,应用老是起不来,没想到这个还是spring boot的bug...这里记录一下: 首先来看一下相关的依赖: &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&...

记忆碎片 1948

JLink 添加国产芯片手把手教程(雅特力 + 华大)

拷贝厂商算法文件夹 + 配置 JLinkDevices.xml。雅特力直接复制官方配置,华大按需添加芯片节点,操作一次,永久生效,以后调试 AT32、HC32 再也不用愁找不到型号。这套方法适配全版本 JLink,也是国产 MCU 替代项目的必备技能,看完照着做,新手也能轻松搞定。百度网盘资料分享:通过网盘分享的文件:jink驱动(包括新增芯片型号)链接: https://pan.baidu.com/s/14SLgrPfyof1lglD6VQguAw?pwd=cfuq 提取码: cfuq。

weixin_48867130的博客 709

泛微OA表单设计实战:如何快速实现自定义多选浏览框(附完整配置步骤)

本文详细介绍了在泛微OA中快速实现自定义多选浏览框的完整配置步骤。针对招聘提报、活动审批等需要从海量数据中规范选择多个条目的业务场景,文章从理解需求、构建数据源、设计查询页面到创建浏览框控件,提供了清晰的实战指南,帮助开发者高效解决复杂数据选择难题,提升表单操作体验。

yog99的博客 1048

SpringBoot2核心技术

文章目录学习目标一、SpringBoot2核心技术,基础入门1、Spring与SpringBoot1.1 Spring可以做什么1.2 Sping的生态2、为什么要学习使用SpringBoot1、Spirng的优点2、Spirng的缺点3、背景3.1 微服务(2014年提出)3.2 分布式3.2 云原生(有点空洞暂时不做了解) 学习目标 熟悉使用SpringBoot进行快速构建并开发项目。 一、SpringBoot2核心技术,基础入门 学习要求: 熟悉Spring基础、熟悉Maven使用 环境要求:

VIP_1205169154的博客 1995

LTE/NR中的相应cause场景【原创】

目录1.背景2.LTE EMM cause2.0 写在最前2.1 特殊处理的cause第一梯队第二梯队2.2 非特殊处理的cause3.NR cause 实网分析终端被拒等问题,经常遇到各类cause,其会对应不同的终端限制行为。查找已有资料后理解没有很深,自行总结本文用于梳理现象,如有错误敬请指正,转载请注明出处。 本文用于记录协议Ts 24.301及Ts 24.501中的cause及其对应行为。 已总结的cause值: 24.301中的cause分

2301_79567300的博客 3488

java web 常见框架

Java web 主流框架 成熟框架 hibernate 框架 hibernate 是一种ORM框架,全称Object-Relative Database-Mapping,在Java对象与关系型数据库之间建立某种映射,以实现直接存取Java对象(POJO)。ORM框架与MVC不同思想与适用范围。 常规读写操作是:使用JDBC连接读写数据库,最常见的打开数据库连接,使用复杂的sql语句读写,关闭连接,获取的数据又需要转换或封装后往后传,非常繁琐。 而hibernate框架,它需要你创建一系列的持久化层,每个类

Lelouch_E的博客 2277

Windows 10下Carla 0.9.15安装避坑指南:从下载到运行的全流程解析

本文详细解析了在Windows 10系统上安装和运行Carla 0.9.15自动驾驶仿真平台的全流程。内容涵盖从系统环境准备、资源下载、Python依赖安装,到首次启动验证及常见错误(如DLL缺失、显卡驱动问题)的深度解决方案,旨在帮助用户快速搭建稳定的开发环境,并运行第一个自动驾驶Python脚本。

alice7model的博客 546

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

算法如诗的博客 153

spring rest 容易被忽视的后端服务 chunked 性能问题

spring boot 容易被忽视的后端服务 chunked 性能问题 标签(空格分隔): springboot springmvc chunked 作者:王清培(Plen wang) 沪江Java资深架构师 背景 spring boot 创建的默认 spring mvc 项目 集成 JAX-RS 规范框架 Jersey 背景 在之前的一次性能压测的时候我们发现一个细节问题,我们使...

dengzai7446的博客 411

RHCA ---RH442-4

这题考试中是没有的,但我做ex的判分脚本里做了,主要是lab环境swap只有512M的,这样后续改了某几个参数后会造成内存不够用导致异常.这里记得是双>,如果没自信的小伙伴可以在考试开始后第一时间把/etc/fstab先备份一个或者vi进入后手动敲一下。根据题意我们需要分2个768M的分区给swap。用free看swap大小是2.0Gi即可。留意红框中的内容即可,最后w保存退出。这个时候可以重启下机器。

Q先生 641

Java Web目前主流的框架以及正在兴起的框架

转载:https://blog.youkuaiyun.com/kingscoming/article/details/78837809 Java Web目前主流的框架以及正在兴起的框架 &amp;lt;div class=&quot;article-info-box&quot;&amp;gt; &amp;lt;div class=&quot;article-bar-top d-flex&qu

十豆三展的博客 9429

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

为什么不用SSH了?SSH过时了吗?

ssh最重要的还是后端处理,前端渲染部分已经被如今的互联网公司废掉了,例如用Vue等框架替代。 而且随着docker一波热,相比早期“一站到底”的大而全,现在很多非核心的模块,被细化拆分,人称微服务。互联网公司节奏很快,迭代也很快,天生对小而微的的东西有亲近感——因为开发速度快,不需要太多人合作,沟通和学习成本很低。 springboot,本质还是spring,但是坑很多。所以如果...

村雨的博客 4434

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Swagger V3 Java 整合记录

Swagger V3 Java 整合记录 最最重要的前言 以下文章是针对 swagger v3 版本的 整合过程 ,这里用了 jersey , 整个过程其实很简单 , 但是社区里面没有找到中意的过程 , 一会弄完的事情却花了大半天 ,属实不太划算 . 所以 , 这是整个源码 ,拿去不谢 , 下面其实不用看了 , 感觉省事了麻烦点个赞 https://github.com/black-ant/c...

black-ant 4691

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

简洁、高效、灵活:探索 Spring 同级别的编程框架

spring同级别框架

做一个有思想的技术人 1001

Spring Boot项目启动报错com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connec

报错内容: com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect 或者com.netflix.discovery.shared.transport.TransportException: Cannot execute request on ...

our小幸福的博客 3789

SpringBoot源码分析之SpringApplication构造方法核心源码分析

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取! this.webApplicationType = WebApplicationType.deduceFromClasspath();跟踪进去看代码static WebApplicationType deduceFromClasspath() {if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null)&& !ClassUtils.isPresent(WE

2401_84048671的博客 427

Java RESTful 框架的性能比较

  2017-02-03 ImportNew (点击上方公众号,可快速关注)   来源:鸟窝, colobu.com/2015/11/17/Jax-RS-Performance-Comparison/ 如有好文章投稿,请点击 → 这里了解详情   在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker...

weixin_34378969的博客 69
上一篇: 微服务系列文章之 SpringCloud面试
下一篇: DevOps系列文章之 DevOps 运维服务体系
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值