Springboot 整合Jersey

摘要:
//文件。春天io/spring boot/docs/2.1.4。RELEASE/reference/html single/#boot特性jersey1。导入依赖项<importcn.xm.mapper.common.MessageMapper;importlombok.externa.slf4j.slf4j;importjavax.ws.rs.*;

  在查看EurekaServer 服务端代码时偶然看到Jersey这个东西,简单记录下。

1. 简介

  Jersey是一个RESTFUL请求服务JAVA框架,与常规的JAVA编程使用的struts框架类似,它主要用于处理业务逻辑层。

  1.X的版本是sun公司提供的独立的jar包,在2.X版本中已经将jersey融合到JavaSE中,在javax.ws.rs.*包中。

  参考:https://eclipse-ee4j.github.io/jersey/

2. Springboot 整合Jersey

参考: https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/htmlsingle/#boot-features-jersey

1. 引入依赖

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

2. 编写资源(在Jersey 中一切借口皆为资源)

package cn.xm.controller;

import cn.xm.bean.common.Message;
import cn.xm.mapper.common.MessageMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.ws.rs.*;
import java.util.List;

@Component
@Path("/{version}/messages") // 类似SpringMVC,这里可以不写, 也可以用通配符
//@Path("/messages") // 类似SpringMVC,这里可以不写, 也可以用通配符
@Slf4j
//@Produces({"application/xml", "application/json"}) // 标记可生产的数据类型, 也就是客户端Accept 的类型
//@Consumes({"application/json", "application/xml", "*/*"}) // 标记可以接受的类型, 也就是Content-Type
public class MessageResource {

    @Autowired
    private MessageMapper messageMapper;

    @GET
    @Path("/index")
    public String index() {
        return "cn.xm.controller.UserResource.index";
    }

    @GET
    @Path("/get")
    public Message get() {
        List<Message> users = messageMapper.findAll();
        return users.get(0);
    }

    @GET
    @Path("/get2")
    public Message get2() {
        List<Message> users = messageMapper.findAll();
        return users.get(0);
    }

    @GET
    @Path("/get3")
    public Message get3() {
        List<Message> users = messageMapper.findAll();
        return users.get(0);
    }

    @GET
    @Path("/get4/{pkUser}")
    public Message get4(@PathParam("pkUser") Integer pkUser, @PathParam("version") String version, @QueryParam("status") String status, @HeaderParam("my_token") String my_token) {
        log.info("pkUser: {}", pkUser);
        log.info("version: {}", version);
        log.info("status: {}", status);
        log.info("my_token: {}", my_token);
        return messageMapper.findOne(pkUser);
    }

}

3. 注册资源

package cn.xm.config;

import cn.xm.controller.MessageResource;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.stereotype.Component;

import javax.ws.rs.ApplicationPath;

@Component
@ApplicationPath("/testJersey")
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(MessageResource.class);

        // 还可以注册过滤器等

        // 注册包
//        packages("xxx")
    }
}

  这里需要注意,ApplicationPath 是指定Jersey 开始的路径,默认是/*。  当我们指定为/testJersey 之后,默认会被重置为/testJersey/*

4. Message 实体类

import cn.xm.bean.AbstractSequenceEntity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.xml.bind.annotation.XmlRootElement;

//公共信息表
@Entity
@XmlRootElement
public class Message extends AbstractSequenceEntity {

    private String name;

    /**
     * 用于所属区域
     */
    private String messageblank;

    @Column(length = 20000)
    private String content;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getMessageblank() {
        return messageblank;
    }

    public void setMessageblank(String messageblank) {
        this.messageblank = messageblank == null ? null : messageblank.trim();
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content == null ? null : content.trim();
    }
}

5. 启动后测试:(会根据我们接受的类型自动返回XML或者JSON)

j@x MINGW64 /e/ideaspace
$ curl --header 'Accept: application/json' http://localhost:8088/testJersey/v1/messages/index
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    35  100    35    0     0   1666      0 --:--:-- --:--:-- --:--:--  1842cn.xm.controller.UserResource.index

j@x MINGW64 /e/ideaspace
$ curl --header 'Accept: application/json' http://localhost:8088/testJersey/v1/messages/get
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   246  100   246    0     0  11181      0 --:--:-- --:--:-- --:--:-- 11714{"creator":"admin","createtime":"2021-03-11","remark1":null,"remark2":null,"remark3":null,"properties":null,"propertiesMap":{},"id":1,"name":"姹傜編椋?,"messageblank":"缇庨�","content":"鍖椾含鍝�噷鏈夊ソ鍚冪殑锛?,"createtimeStr":"2021-03-11"}

j@x MINGW64 /e/ideaspace
$ curl --header 'Accept: application/xml' http://localhost:8088/testJersey/v1/messages/get
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   261  100   261    0     0  13050      0 --:--:-- --:--:-- --:--:-- 13736<?xml version="1.0" encoding="UTF-8" standalone="yes"?><message><createtime>2021-03-11T10:38:19+08:00</createtime><creator>admin</creator><id>1</id><content>鍖椾含鍝�噷鏈夊ソ鍚冪殑锛?/content><messageblank>缇庨�</messageblank><name>姹傜編椋?/name></message>

j@x MINGW64 /e/ideaspace
$ curl --header 'Accept: application/xml' --header 'my_token: 111222' http://localhost:8088/testJersey/v1/messages/get4/1?status=1234
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   261  100   261    0     0   9000      0 --:--:-- --:--:-- --:--:--  9321<?xml version="1.0" encoding="UTF-8" standalone="yes"?><message><createtime>2021-03-11T10:38:19+08:00</createtime><creator>admin</creator><id>1</id><content>鍖椾含鍝�噷鏈夊ソ鍚冪殑锛?/content><messageblank>缇庨�</messageblank><name>姹傜編椋?/name></message>

控制台日志如下:

2021-03-18 09:21:12.383  INFO 32328 --- [nio-8088-exec-4] cn.xm.controller.MessageResource         : pkUser: 1
2021-03-18 09:21:12.383  INFO 32328 --- [nio-8088-exec-4] cn.xm.controller.MessageResource         : version: v1
2021-03-18 09:21:12.383  INFO 32328 --- [nio-8088-exec-4] cn.xm.controller.MessageResource         : status: 1234
2021-03-18 09:21:12.383  INFO 32328 --- [nio-8088-exec-4] cn.xm.controller.MessageResource         : my_token: 111222

3. 自动配置简单查看

参考:org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration 类

org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration#jerseyServletRegistration 这里注册一个Servlet:

    @Bean
    @ConditionalOnMissingBean(name = "jerseyServletRegistration")
    @ConditionalOnProperty(prefix = "spring.jersey", name = "type", havingValue = "servlet", matchIfMissing = true)
    public ServletRegistrationBean jerseyServletRegistration() {
        ServletRegistrationBean registration = new ServletRegistrationBean(
                new ServletContainer(this.config), this.path);
        addInitParameters(registration);
        registration.setName(getServletRegistrationName());
        registration.setLoadOnStartup(this.jersey.getServlet().getLoadOnStartup());
        return registration;
    }

  这里注册的这个ServletContainer 是一个Servlet 也是一个Filter。在下面方法注册为Filter

    @Bean
    @ConditionalOnMissingBean(name = "jerseyFilterRegistration")
    @ConditionalOnProperty(prefix = "spring.jersey", name = "type", havingValue = "filter")
    public FilterRegistrationBean jerseyFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new ServletContainer(this.config));
        registration.setUrlPatterns(Arrays.asList(this.path));
        registration.setOrder(this.jersey.getFilter().getOrder());
        registration.addInitParameter(ServletProperties.FILTER_CONTEXT_PATH,
                stripPattern(this.path));
        addInitParameters(registration);
        registration.setName("jerseyFilter");
        registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
        return registration;
    }

  所以Jersey 相关的入口就是这个ServletContainer类。 可以理解为也是进入service 之后进行一系列判断之后获取到对应的Resource 进行处理,Resource 可以理解为Handler。

免责声明:文章转载自《Springboot 整合Jersey》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇grub rescue问题修复cheap-source-map--不显示源码 、source-map--显示源码 、 eval--最快的编译办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue 移动端添加 时间日期选择器

效果:  index.vue <template> <div class="user-wrap" style="padding-bottom: 0;text-align: center"> <h1>-----------------------时间选择器------------------...

如何防止同一同时用户多次登录

http://www.cnblogs.com/guojin705/archive/2008/01/26/1054199.html 这里指的单点,泛指在WEB服务端,一个账户同一时刻只能存在一个票据!大家开发中可能都碰到的一个问题,怎么使同一个用户,在同一时间内只允许登录一次。很多人都会想到在数据库中用一个标识字段,登录进去置1,退出置0,登录时判断这个字段...

IDEA内置常用代码模板和DUG模式

/**IDEA中代码模板 psvm 调用main方法 sout 调用输出语句 soutp :可以打印形参 soutm :打印方法名 soutv:打印变量fori:for循环 iter:增强for循环 ifn 或者 XX.null: if (XX == null) {} inn 或者 XX.nn : if (XX != null) {}prsf :...

Moco模拟服务器post&amp;amp;get请求 (二)

1、moco启动命令如下:java -jar moco-runner-0.12.0-standalone.jar 协议类型 -p 端口号 -c json配置文件 2、带参数的get请求 [ { "request":{ "method":"get", "uri":"/api/get_event_list", "queri...

Android有用的任务管理器—tractor

在平时的android开发工作中,我们常常须要运行耗时操作,有时为了用户体验还须要显示个等待框,我之前的做法都是开一个线程,然后用handler发消息进行显示和关闭等待框以及相关的ui操作。假设任务比較多的话,频繁的new Thread会让代码看上去比較混乱,并且还不好管理,针对这样的情况我写了tractor。 tractor基本的作用有: 1. 代码...

java微信小程序参数二维码生成带背景图加字体(无限生成)

需求 :           1,因为项目需求 ,生成数以万计的二维码         2 ,每个二维码带不同的参数      3,二维码有固定背景图            4 , 往生成图片上写入 字体和编号(动态 )  设计技术 :    1,微信接口token ,nginx 缓存     2,二维码 图片定义 写字  maven  <depen...