Spring Boot部署到Resin遇到的问题

Spring-boot-1.3.1

Resin-4.0.47

部署Spring Boot到Resin后,出现异常:

2016-01-23 23:41:02,334 [WARN ] o.s.b.f.s.DefaultListableBeanFactory - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.U

nsatisfiedDependencyException: Error creating bean with name 'userWoundedArmyMapper' defined in URL [jar:file:/opt/resin-test/webapps/rabbit-webapp/WEB-INF/l

ib/rabbit-dao-0.0.1-SNAPSHOT.jar!/com/qiyun/persistence/UserWoundedArmyMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFacto

ry': : Error creating bean with name 'org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration': Injection of autowired dependencies failed; nested exc

eption is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.mybatis.spring.boot.autoconfigure.MybatisProperties

org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.properties; nested exception is org.springframework.beans.factory.BeanCreationException: Error

creating bean with name 'mybatis.CONFIGURATION_PROPERTIES': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not ini

tialize class org.hibernate.validator.internal.engine.ConfigurationImpl; nested exception is org.springframework.beans.factory.BeanCreationException: Error c

reating bean with name 'org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration': Injection of autowired dependencies failed; nested exception is org.

springframework.beans.factory.BeanCreationException: Could not autowire field: private org.mybatis.spring.boot.autoconfigure.MybatisProperties org.mybatis.sp

ring.boot.autoconfigure.MybatisAutoConfiguration.properties; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean

with name 'mybatis.CONFIGURATION_PROPERTIES': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class

org.hibernate.validator.internal.engine.ConfigurationImpl

-  -

2016-01-23 23:41:02,894 [WARN ] o.s.b.f.s.DefaultListableBeanFactory - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.U

nsatisfiedDependencyException: Error creating bean with name 'userWoundedArmyMapper' defined in URL [jar:file:/opt/resin-test/webapps/rabbit-webapp/WEB-INF/l

ib/rabbit-dao-0.0.1-SNAPSHOT.jar!/com/qiyun/persistence/UserWoundedArmyMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFacto

ry': : Error creating bean with name 'sqlSessionFactory': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested excep

tion is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'sqlSessionFactory': Requested bean is currently in

creation: Is there an unresolvable circular reference?

异常的大概问题就是,创建'userWoundedArmyMapper'时失败,因为无法注入sqlSessionFactory失败。

而sqlSessionFactory在MybatisAutoConfiguration中创建的,故需要先创建MybatisAutoConfiguration,在创MybatisAutoConfiguration时失败,因为无法注入MybatisProperties。

创建MybatisProperties后,初始化MybatisProperties失败,因为它的初始化是由ConfigurationPropertiesBindingPostProcessor进行初始化的,在ConfigurationPropertiesBindingPostProcessor中,使用了Javax Validation,在应用中使用了Hibernate的Validation实现,找不到ConfigurationImpl的定义。

进行远程Debug,并结合jvminspect.jar,发现Resin/lib目录下存在validation-api和hibernate-validator,且版本与项目引用的版本不一致。

ConfigurationImpl类,发现静态代码块

static{

Version.touch();

}

private static final Log log = LoggerFactory.make();

LoggerFactory类的make方法:

public static Log make() {

Throwable t =newThrowable();

StackTraceElement directCaller = t.getStackTrace()[1];

returnLogger.getMessageLogger( Log.class, directCaller.getClassName() );

}

其中使用了jboss的logging,很有可能是jboss logging存在多个版本导致ConfigurationImpl静态代码块执行失败,发现Resin/lib下存在jboss-logging,于是问题明朗了。

由于重复的validation-api、hibernate-validator、jboss-logging,导致加载ConfigurationImpl后进行静态代码块执行时,引用jboss logger错误,导致ConfigurationImpl出现NoClassDefFoundError。

解决方法:删除Resin/lib下的validation-api、hibernate-validator、jboss-loggingjar包。

之后,又出现了另外的问题:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

at java.util.ArrayList.rangeCheck(ArrayList.java:635) ~[na:1.7.0_67]

at java.util.ArrayList.get(ArrayList.java:411) ~[na:1.7.0_67]

at com.caucho.server.webapp.WebApp.hasListener(WebApp.java:2197) ~[resin.jar:4.0.47]

at com.caucho.server.webapp.WebApp.addListenerObject(WebApp.java:2148) ~[resin.jar:4.0.47]

at com.caucho.server.webapp.WebApp.addListener(WebApp.java:2108) ~[resin.jar:4.0.47]

经过查看Resin源码,发现这是resin-4.0.45版本中引入的bug:

/**

* Returns true if a listener with the given type exists.

*/

public boolean hasListener(ArrayList listeners, Class listenerClass)

{

for (int i = 0; i < listeners.size(); i++) {

Object listener = _listeners.get(i);

if (listener.getClass().equals(listenerClass)) {

return true;

}

}

return false;

}

其中Object listener = _listeners.get(i);的_listeners使用了类属性,而不是参数listeners,导致异常,这个BUG只能等后续版本修复。

于是,我下载了未引入这个BUG的Resin-4.0.44版本,运行之后,又发现了新的问题:

Custom bean class '{0}' is not public.  Bean classes must be public, concrete, and have a zero-argument constructor.

经过查看Resin源码,发现com.caucho.server.dispatch.FilterConfigImpl的setFilterClass方法:

@DisableConfig

public void setFilterClass(Class filterClass)

{

this._filterClass = filterClass;

Config.validate(this._filterClass, Filter.class);

}

这又是Resin的一个BUG,当直接添加Filter对象到ServletContext时,Resin还会去验证Filter的CLass是不是public的类。这个Bug在Resin-4.0.46中修复了。

servlet: drop instantiation check for instances of servlets and filters (#5934)

@DisableConfig

public void setFilterClass(Class filterClass)

{

_filterClass = filterClass;

if (_filter == null)

Config.validate(_filterClass, Filter.class);

}

为了解决这个问题,必须使用Resin-4.0.46以后的版本。

综合Resin上诉2个BUG,导致Resin目前没有一个版本可以完美支持Spring Boot,只能换Tomcat和Jetty了。

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

推荐阅读更多精彩内容