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

news2024/11/26 0:55:53

​ 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等不同类型的组件注册从主类中分开,在代码管理上会更加清晰。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(一)python实战——使用Pyinstaller打包一个python的exe可执行文件

前言 在python编程中&#xff0c;我们往往需要将我们的应用程序打包成一个可执行文件&#xff0c;方便使用。如果是单独的python文件&#xff0c;其他人使用前必须要先安装python环境&#xff0c;在python环境中通过命令执行我们的python程序。本节内容我们主要介绍一下使用Py…

团体程序设计天梯赛-练习集L2篇⑥

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

数据结构--算法时间复杂度

数据结构–算法时间复杂度 在计算算法时间复杂度的时候&#xff0c;我们可以忽略表达式某些部分。 eg&#xff1a; T 1 ( n ) 3 n 3 T_1(n) 3n 3 T1​(n)3n3 ⇒ O ( n ) O(n) O(n) T 2 ( n ) n 2 3 n 1314 T_2(n) n^23n1314 T2​(n)n23n1314 ⇒ O ( n 2 ) O(n^2) O…

【嵌入式烧录/刷写文件】-S19文件解析(首行数据解析)

目录 一、概述二、S19文件解析三、举例 一、概述 &#xff11;.概述&#xff1a; Motorola S-record是一种文件格式&#xff0c;由摩托罗拉在20世纪70年代中期为Motorola 6800处理器创建&#xff0c;以ASCII文本形式传达二进制信息的十六进制值&#xff0c;其文件格式也可能为…

Microsoft Fabric 学习----- Lakehouse vs Warehouse

做了几年Power BI 开发人员&#xff0c;微软最近上发布了Microsoft Fabric, 对它的研究安排起来! 从微软官方中文文档入手 Microsoft Fabric 中的端到端教程 - Microsoft Fabric | Microsoft Learn Microsoft Fabric 是将 Power BI、Azure Synapse 和 Azure 数据资源管理器中…

十款好看简洁的个人引导页html源码

资源详情&#xff1a;十个 引导页介绍页html源码下载使用方法 怎么让源码更适合你&#xff1f;改造 一、 介绍&#xff1a; 好看自适应导航网站发布页网页html源码&#xff01;自适应电脑手机 这是一个网页单页源码&#xff01;&#xff01; 模板无后台模板&#xff0c;上传…

基于51单片机设计的计算器

一、项目介绍 计算器是一种常见的电子产品,广泛应用于各个领域。而基于单片机的计算器设计则是学习单片机的一个重要环节。本项目基于STC89C52单片机设计了一款基本的四则运算计算器。 项目里采用了单片机的IO口、定时器和LCD1602显示屏等技术原理。其中,IO口用于控制矩阵键…

大数据技术的未来发展趋势怎么样?

所谓大数据技术&#xff0c;就是对海量数据进行科学分析和有效处理的一种先进技术形式。该技术的优点主要在于可以对各种风格、类型的海量数据进行处理。相较于网络数据的传统处理技术&#xff0c;大数据技术的应用不仅可以实现数据处理量显著扩大&#xff0c;还可以实现各种复…

#10034. 「一本通 2.1 例 2」图书管理

10034. 「一本通 2.1 例 2」图书管理 题目描述 图书管理是一件十分繁杂的工作&#xff0c;在一个图书馆中每天都会有许多新书加入。为了更方便的管理图书&#xff08;以便于帮助想要借书的客人快速查找他们是否有他们所需要的书&#xff09;&#xff0c;我们需要设计一个图书…

ModaHub魔搭社区:安装、启动 Milvus 服务(GPU版)教程

目录 安装、启动 Milvus 服务 安装前提 操作系统 硬件 软件 确认 Docker 状态 拉取 Milvus 镜像 下载并修改配置文件 启动 Milvus Docker 容器 常见问题 接下来你可以 安装、启动 Milvus 服务 CPU 版 Milvus GPU 版 Milvus 安装前提 操作系统 操作系统 版本 Ce…

TOGAF10®标准中文版--(阶段C —数据架构阶段B )方法

6.5 方法 6.5.1 数据结构 数据架构应该能够处理&#xff1a; 静态数据——存储中的数据动态数据——事务或服务/API 中的数据使用中的数据——应用边界的数据&#xff08;例如&#xff0c;GUI&#xff09;开放数据——组织提供给公众使用并且自愿或合法要求提供的数据 将添…

创业史|苏萌:我与百分点科技的故事

编者按 苏萌曾是北京大学光华管理学院营销学教授&#xff0c;在学术领域崭露头角时&#xff0c;他毅然辞去教职&#xff0c;创立了百分点科技。百分点科技是一家服务全球政府和企业的大数据软件及解决方案提供商&#xff0c;主要从事数据科学基础软件与应用软件的研发与服务。一…

业务创新的利器:探索Flutter与小程序容器的融合应用

Flutter是由谷歌开发的开源用户界面&#xff08;UI&#xff09;工具包&#xff0c;用于构建跨平台移动应用程序、Web应用程序和桌面应用程序。它采用一种现代化的方式&#xff0c;使用单一代码库可以同时构建iOS和Android应用&#xff0c;并且能够实现高性能、高保真的用户界面…

国产十大骨传导耳机品牌,分享几款实战性高的国产骨传导耳机

骨传导耳机在运动过程中不需要通过耳部进行传音&#xff0c;所以佩戴舒适度高&#xff0c;而且不会像入耳式耳机那样堵住耳朵&#xff0c;导致耳部的不舒适感&#xff0c;并且可以清晰的听到外界声音。骨传导耳机适合于户外运动、骑行、跑步等运动场景。此外&#xff0c;骨传导…

调用聚合数据API获取新闻头条

调用聚合数据API获取新闻头条 1&#xff0e;作者介绍2&#xff0e;API和聚合数据API的介绍2.1 API简介2.2 聚合数据API 3&#xff0e;实验过程介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1参数说明3.2获取代码3.3代码实现3.4问题与分析 1&#xff0e;作者介绍 姚嘉欣…

【Python】python进阶篇之模块化编程

模块与包 模块化编程 与java中的import功能类似&#xff0c;在python中&#xff0c;一个.py文件就是一个模块。 ⚠️&#xff1a;模块名称不要与python自有模块名称相同。 模块的导入 导入Python中自有的包 导入语法和前端的模块化开发语法很像 import math from math im…

学习Vue(4)

文章目录 路由简介基本使用模式设置注意点 组件一般组件路由组件 多级路由总结 路由传参参数传参query总结 params参数总结 命名路由总结 props对象写法设为trueprops为函数 按钮实现跳转和前进后退独有的生命钩子activated()deactivated() 路由守卫前置路由守卫后置路由守卫独…

基于OpenCV的人脸对齐步骤详解及源码实现

目录 1. 前言2. 人脸对齐基本原理与步骤3. 人脸对齐代码实现 1. 前言 在做人脸识别的时候&#xff0c;前期的数据处理过程通常会遇到一个问题&#xff0c;需要将各种人脸从不同尺寸的图像中截取出来&#xff0c;再进行人脸对齐操作&#xff1a;即将人脸截取出来并将倾斜的人脸…

JVM-java对象内存分布(二)

目录 一、栈针 二、java 对象内存分布 1、那何为java内存对象布局&#xff1f; 2、什么是jvm的内存模型 1、如果我们新生代&#xff0c;一直创建新对象&#xff0c;此时我们新生代不够用了怎么办&#xff1f; 2、那么为什么大部分对象的生命周期比较短呢&#xff1f;这个…

HCIP-7.3QinQ技术原理、配置链路聚合Eth-Trunk

HCIP-7.3QinQ技术原理、配置&链路聚合Eth-Trunk 1、QinQ概述1.1、QinQ实现方式&#xff1a;1.2、QinQ封装结构&#xff1a;1.3、QinQ的分类&#xff1a;1.3.1、基于端口的QinQ1.3.2、灵活QinQ 2、链路聚合Eth-Trunk2.1、Eth-Trunk基本原理2.2、手工聚合模式2.2.1、配置接口…