项目中没用spring 的restTemplate 而是采用 jersey来做rest 的实现,一直用着,也没发现有什么不对,后来加入了,以quartz用硬编码方式实现,结果启动项目的时候报错 ,具体信息为job id重复。后来经排查是因为:jersey依赖于org.springframework.web.context.ContextLoaderListener初始化 的ApplicationContext,而spring mvc 依赖于org.springframework.web.servlet.DispatcherServlet初始化的ApplicationContext,也就是说jersey和spring mvc 虽然是共用一个ApplicationContext但是ApplicationContext被初始化了两次,每次都会调用 beanFactory.preInstantiateSingletons()方法,导致了单例的类被初始化两次,平常使用是没问题的,只是每个单例类都实例化了两个对像(bean工厂中,你访问到的是第二次实例化的),恰巧我们的项目中,SchedulJobManager实例化后我们要设置一些JOB ,且这个JOB的ID是不能重复的,就触发了这个BUG。jersey版本比较老1.4.1,不知新版本的 jersey会不会不存在这问题,且最后我通过修改spring AbstractApplicationContext源码 解决了这问题,具体排查解决过程如下如下图

很是奇怪,然后在构造函数中加了一个日志输出,下如图所示,结果发现 Schedul Initializing 这行条了两次

接下来,检查web.xml 的配置 如下图所示

后来还怀疑过是不是 jersey这个springServlet搞的鬼,去掉他,还是有同样的错 ,当时对这事,有个临时的解决办法,加一个全局静态变量 haveInit,在构造函中设置它为true PostConstruct标签的方法run方法中,如haveInit为true 就什么也不错返回。问题是解决了,但不是从根本上解决,于是我在代码中加了调用栈的打印。如图所示

打印出来的结果是  ,org.springframework.web.context.ContextLoaderListener和org.springframework.web.servlet.DispatcherServlet分别都初始化了一次 appcationContext导致的,请看下图

解决办法是修改 spring AbstractApplicationContext类,做这样的修改:加一个全局静态变量 haveInitFlg缺省值为0 ,在finishBeanFactoryInitialization方法中

最后一行代码beanFactory.preInstantiateSingletons();  修改为

if(haveInitFlg==0){
            beanFactory.preInstantiateSingletons();
            haveInitFlg = 1;
        }

即可

(原创)spring mvc和jersey rest 组合使用时单例对像实例化两次的BUG及解决办法的更多相关文章

  1. spring mvc 的Controller类默认Scope是单例(singleton)的

    使用Spring MVC有一段时间了,之前一直使用Struts2,在struts2中action都是原型(prototype)的, 说是因为线程安全问题,对于Spring MVC中bean默认都是(s ...

  2. ubuntu修改capslock键,单独使用为esc,组合使用时为ctrl+

    一.下面这部分可以将capslock与ctrl互换 将下面的代码放入-/.Xmodmap中, remove Lock = Caps_Lock remove Control = Control_L ke ...

  3. tqdm和zip组合使用时无法显示进度条-解决办法

    问题 单独对于可迭代对象iterator使用tqdm时,结合循环就可以在终端显示进度条, 以直观展示程序进度,如下: from tqdm import tqdm textlist = [] for i ...

  4. Spring 源码学习 - 单例bean的实例化过程

    本文作者:geek,一个聪明好学的同事 1. 简介 开发中我们常用@Commpont,@Service,@Resource等注解或者配置xml去声明一个类,使其成为spring容器中的bean,以下我 ...

  5. [原创]Spring MVC 学习 之 - URL参数传递

    原文参考地址: http://www.cnblogs.com/rhythmK/p/3971191.html 目的和缘由: 本人想做一个分享的页面,分析给朋友注册,注册按分享ID进行级联; 过程: 很多 ...

  6. [Spring MVC]学习笔记--form表单标签的使用

    github例子地址: https://github.com/lemonbar/spring-mvc-jsp 效果图 关于spring mvc的标签的讲解, 有一篇blog已经讲的很细了. http: ...

  7. 关于Spring的HibernateTemplate的findByExample方法使用时的一点注意。

    此前我们已经介绍了HibernateTemplate的使用配置方法,但是对其使用没有仔细说明.因为最近比较忙,我先不去介绍,而是重点说明一下容易引起问题的findByExample方法. 我尝试反编译 ...

  8. [原创]在使用SDK 23(6.0)版本后org.apache.http相关的类找不到的解决办法

    参考: http://stackoverflow.com/questions/32153318/httpclient-wont-import-in-android-studio http://www. ...

  9. ASP.NET MVC 使用jquery.form.js 异步上传 在IE下返回值被变为下载的解决办法

    错误记录: <script type="text/javascript"> $(function () { $(document).off("ajaxSend ...

随机推荐

  1. BAT面经

    http://bbs.csdn.net/topics/390734210?page=4 注意评论以及文章原地址

  2. QTP10&QTP11&UFT11.5的安装和破解

    QTP10的安装和破解方法 下载QTP10.0并安装. 安装成功后,在C:\Program Files\Common Files\Mercury Interactive下创建文件夹:License M ...

  3. OAuth2.0和SSO授权的区别

    OAuth2.0和SSO授权   一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该 ...

  4. Collection_Compare

    冒泡 package com.bjsxt.sort.bubble; import java.util.Arrays; public class BubbleSort1 { /** * @param a ...

  5. sublime安装插件

    今天因为某些原因,把 sublime 卸载掉了,然后来安装的时候,发现 Package Control  无法安装了,或者安装好后运行 ctrl + shift + p,会报 错误,截图如下: 然后就 ...

  6. UrlRewriter.dll伪静态实现二级域名泛解析

    大家应该知道,微软的URLRewrite能够对URL进行重写,但是也只能对域名之后的部分进行重写,而不能对域名进行重写, 如:可将 http://http://www.115sou.com/qq/  ...

  7. sql2005数据库转换成sql2000

    第一步:在SQL2005中生成脚本文件 ①     在2005中选中要进行转换的那个数据库,鼠标“右键”选择—“属性”—“选项”:修改“兼容级别”为“SQL Server 2000 (80)”: ②  ...

  8. WDF模型驱动程序开发

    WDF驱动程序开发 1. 引言 设备驱动程序是硬件设备连接到计算机系统的软件接口,任何设备都必须有相应的驱动程序才能在计算机系统上正常工作.设备驱动程序的优劣直接关系到整个系统的性能和稳定性,因此,设 ...

  9. I.MX6 android 设置 默认 动态桌面

    /************************************************************************ * I.MX6 android 设置 默认 动态桌面 ...

  10. LeetCode Letter Combinations of a Phone Number 电话号码组合

    题意:给一个电话号码,要求返回所有在手机上按键的组合,组合必须由键盘上号码的下方的字母组成. 思路:尼玛,一直RE,题意都不说0和1怎么办.DP解决. class Solution { public: ...