填坑之路(SpringBoot Jersey)

Why?

技术变革的车轮不断向前,伴随着k8s、docker等新技术的落地,陈旧的技术栈,千疮百孔的工程,已经逐步成为技术负债的黑洞。秉承着“前人挖坑后人骂,后人填坑苦哈哈”的精神,我来吧,苦哈哈。

What?

  • Jersey2.x 多Servlet-Mapping

Spring 3 映射Mappings,基于web.xml 映射Servlet,如以下代码示例,目的是为了实现接口的默认前缀并控制接口版本,以映射不同的鉴权版本、拦截器等

    <servlet>
        <servlet-name>Jersey2</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey2</servlet-name>
        <url-pattern>/rest/v1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Jersey2</servlet-name>
        <url-pattern>/rest/v2</url-pattern>
    </servlet-mapping>
  <servlet-mapping>
        <servlet-name>Jersey2</servlet-name>
        <url-pattern>/rest/v3</url-pattern>
    </servlet-mapping>

基于springboot想实现接口的默认前缀,存在以下几种方式

  • 每一个接口添加前缀 或多个接口实现(当我没说)
  • @ApplicationPath
    然而无法实现多个path共存的想法,因此貌似走到了怪圈里。。走了好久好久好久。。

直到发现了以下的文档:
Springboot 中Jersey 的multiple Application实现
核心思想:即对Servlet扫描规则进行了拓展,完美的解决了以上问题。

  • SpringBoot Jar包运行,提示FileNotFound

原本的配置是这个样子的,基于IDE调试的过程中一直很顺利,直到基于jar部署的时候,凉凉了

public class JerseyConfig extends ResourceConfig {

    public JerseyConfig(){
        //扫描Jersey实例所在包
        packages("com.xx.xx");
        // 注册JacksonFeature
        register(JacksonFeature.class);
    }
}

貌似又走到了怪圈里。。走了好久好久好久。。

直到发现了以下的文档:
jersey在 spring boot 添加 packages 扫描路径支持
核心思想:springboot打包成jar之后,jersey packages扫描不到相关类,故使用Spring的扫描机制进行处理

此处发现可以优化的点,之前是进行包下的所有类扫描并注册,之后启动后会提示一些警告,故可以在之中判断class是有@Path的引用,再进行注册

  • 多Application实例,注册不成功

原以为逃离了怪圈。。好远好远好远。。基于Jar部署后,启动成功了,然而调用接口后,404!!
又又又凉凉凉了。。

貌似又又走到了怪圈里。。走了好久好久。。

之后毅然决然的查看了Application的相关源码,发现了事情的真相。

public class Application {
    
    public Set<Class<?>> getClasses() {
        return Collections.emptySet();
    }
    ...省略
}

getClasses() 方法即为基于以上实例扫描到的Jersey实例,通过debug发现以下为空,瞬间懂了,将上文扫描到的classes,返回即可。

希望这回真的逃离了怪圈。。好远好远好远好远。。

  • @ Produces 不指定类型或者干脆没有这个注解

基于以上的一通儿操作,我以为我今天一定可以霸屏"填坑走多远排行版"第一把交椅,然而又又又又TM的出现了,已经一个正常的请求,后台提示 text/html 没有解析器。

!!!这是一个应该响应成JSON的请求!!!

貌似又又又又又又走到了怪圈里。。有点走走走走走走不动了。。

冷静了许久。。想到了两个解决方案:

  • 全局搜索,然后一个一个补全,之后打死哪些不写全代码的人
  • 配置默认的响应MediaType

最终在Jersey包下找到了以下类ContainerResponseFilter,大体的源码如下

package javax.ws.rs.container;
import java.io.IOException;
public interface ContainerResponseFilter {

    /**
     * Filter method called after a response has been provided for a request
     * (either by a {@link ContainerRequestFilter request filter} or by a
     * matched resource method.
     * <p>
     * Filters in the filter chain are ordered according to their {@code javax.annotation.Priority}
     * class-level annotation value.
     * </p>
     *
     * @param requestContext  request context.
     * @param responseContext response context.
     * @throws IOException if an I/O exception occurs.
     */
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException;
}

关键的一段英文在下面

Filter method called after a response has been provided for a request

!!!在请求的响应返回时触发 !!!

果断实现接口,对于代码做容错,大体逻辑如下:

没有@Produces 响应默认为MediaType.APPLICATION_JSON
有@Produces 但是没有值,则一样变成MediaType.APPLICATION_JSON

To be continued ?

少挖坑,多种树

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352