搭建springmvc环境tomcat出现”Context initialization failed … ExceptionInInitializerError … createBeanFactory”错误

Background: 今天学习spring-mvc resful例子环境搭建,参考Spring 3 REST Hello World Example (from Mykyong.com),很好的例子,很感谢Mkyong.com,也是我应该学习的榜样。(我的环境是eclipse 4.3)

Subject: 但是例子存在疏漏,可能会对充分信赖者和新手产生影响,搭建过程中遇到了以下问题:

首先是ClassNotFoundException : Org.Springframework.Web.Context.ContextLoaderListener

Mkyong.com又给出了解决方法,因为新搭建的eclipse的servers设置是存在问题的,调试环境下需要手动将libs添加到部署设置中(才会部署到webapps/[appname]/WEB-INF/lib下面)此问题解决,但是遇到了新的问题。

(PS:除了缺少spring jar之外,还缺少servlet-api.jar, it can be found under tomcat’s libs folder)

其次遇到了ExceptionInInitializerError问题,即本post标题描述的问题,日志如下: following as console logs:

严重: Context initialization failed java.lang.ExceptionInInitializerError at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:194) at

org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Caused by: java.lang.NullPointerException at org.springframework.beans.factory.support.DefaultListableBeanFactory.(DefaultListableBeanFactory.java:104) … 22 more

五月 22, 2014 1:42:28 上午 org.apache.catalina.core.StandardContext listenerStart 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener java.lang.ExceptionInInitializerError at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:194) at

org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Caused by: java.lang.NullPointerException at org.springframework.beans.factory.support.DefaultListableBeanFactory.(DefaultListableBeanFactory.java:104) … 22 more

五月 22, 2014 1:42:28 上午 org.apache.catalina.core.StandardContext start

(会出现该错误,其实有一定原因Mkyong.com所给图示存在一定的诱导误导性),错误的地方在于spring*.jar以及servlet-api.jar需要添加到User Entries,而不是(图上所显示的)Bootstrap Entries,问题仅此而已,应该如下图所示。

eclipse下tomcat的classpath设置

Flex实现自定义组件默认皮肤示例

今天遇到一个问题,通过css定义自定义组件的皮肤的时,组件的样式失效,仍然为默认样式,(但是通过直接设置组件的skinClass属性时生效)其原因是自定义组件的默认皮肤的设置方法有问题。下面讲讲如何设置自定义组件的皮肤。用code可以将问题表述为:the right way to set customer component’ default skin, won’t cause skin defined in css not working problem. 下面是代码示例: 总共包含4个文件:

/SkinTest.mxml //主应用程序 
/com/ct/codesample/MyComp.as //自定义组件 
/com/ct/codesample/MyCompSkin.mxml // 皮肤1 
/com/ct/codesample/MyCompSkin2.mxml // 皮肤2

MyComp.as代码:

package com.ct.codesample
{
    import flash.events.Event;

    import spark.components.Label;
    import spark.components.supportClasses.SkinnableComponent;

    /**
     * MyComp,即作为示例的自定义组件,具有一个属性:description,以及2个Label外观元素:
     * titleLabelDisplay和valuelabelDisplay。MyComp.as文件只负责组件的逻辑部分。
     * 
     * @author cachetian
     *      2014-05-21
     */
    public class MyComp extends SkinnableComponent
    {
        public function MyComp()
        {
            super();
        }

        private var _description:String

        /**
         * 约定:description的格式必须为<title>,<value>,例如:"组件示例,这是一个组件示例"
         */
        public function get description():String
        {
            return _description;
        }

        // 标记description更改过的标记
        private var isDescriptionChanged:Boolean = false;

        public function set description(value:String):void
        {
            _description = value;
            // 因为属性设置的有可能比皮肤早,所以先要标记一下,稍后皮肤创建的时候记得更新。
            isDescriptionChanged = true;
        }

        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
            // TODO Auto Generated method stub
            super.updateDisplayList(unscaledWidth, unscaledHeight);

            //
            // 这里是组件的逻辑部分示例
            //
            if (isDescriptionChanged)
            {
                isDescriptionChanged = false;
                var slice:Array = description.split(",");
                if (slice.length > 1)
                {
                    titleLabelDisplay.text = slice[0];
                    valuelabelDisplay.text = slice[1];
                }
            }
        }

        [SkinPart]
        public var titleLabelDisplay:Label;

        [SkinPart]
        public var valuelabelDisplay:Label;

        //
        // 注意,这里是设置默认样式的方法
        //
        override protected function attachSkin():void
        {
            if (getStyle("skinClass") == null)
            {
                // 设置默认样式
                setStyle("skinClass", Class(MyCompSkin));
            }
            super.attachSkin();
        }
    }
}

MyCompSkin.mxml代码:



    
        
            [HostComponent("com.ct.codesample.MyComp")]
        
        
            
            
            
            
        
    

MyCompSkin2.mxml代码:



    
        
            [HostComponent("com.ct.codesample.MyComp")]
        
        
            
            
            
            
        
    

SkinTest.mxml代码:



    
        
            @namespace s "library://ns.adobe.com/flex/spark";
            @namespace mx "library://ns.adobe.com/flex/mx";
            @namespace codesample "com.ct.codesample.*";
            .s2{
                skinClass:ClassReference("com.ct.codesample.MyCompSkin2");
            }
            #main_layout{
                gap:10;
                top:10;
                left:10;
                right:10;
            }
        
        
            
            
        
    

下面是运行结果:

SkinTest的运行结果

最后总结一下,我不知道如何是最正确的设置默认Skin的方法,但是至少知道在Constructor构造函数中设置是错误的,会引起我上面说的错误,应该在稍后一点的时机,简单的可以重新在attachSkin方法里。

STS出现“Can not find the tag library descriptor for “http://www.springframework.org/tags””错误

今天使用STS出现如题错误,经重新创建spring starter project并等待其下载依赖、创建完成之后就好了。

enter image description here

出现问题的原因可能是之前在第一次打开STS并使用其创建spring工程的时候是在没网的环境,中间出现过很多下载失败的问题,等重新打开STS,打开那个工程的时候,就出现上述错误了。

Flex URLLoader使用例子

在Flex中一般可以使用URLLoader发起Http请求,示例代码如下:

package com.ct.codesample
{
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.net.URLVariables;

    /**
     * URLLoader 使用例子
     * @author tianmu
     *          2014-05-18
     */
    public class UsingURLLoader
    {
        public function UsingURLLoader()
        {
        }
        
        public function main():void
        {
            try
            {
                var urlLoader:URLLoader = new URLLoader();
                var urlVariable:URLVariables = new URLVariables();
                var urlRequest:URLRequest = new URLRequest();
                
                // 添加事件监听
                addEventListeners(urlLoader);
                
                // 添加输入参数
                urlVariable.username = "ct";
                urlRequest.data = urlVariable;
                urlRequest.url = "http://localhost:8080/HttpServer/hello";
                urlRequest.method = URLRequestMethod.POST;
            
                urlLoader.load(urlRequest);
            }
            catch (error:Error)
            {
                trace("An Error Occur! Error Message is :" + error.message);
                trace(error.getStackTrace());
            }
        }
        
        protected function addEventListeners(urlLoader:URLLoader):void
        {
            urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
            urlLoader.addEventListener(Event.COMPLETE, onComplete);
        }
        
        protected function onIOError(event:IOErrorEvent):void
        {
            trace("onIOError");
            if (null != event)
            {
                trace(event.text);
            }
        }
        
        protected function onComplete(event:Event):void
        {
            trace("onComplete");
            if (null != event)
            {
                try
                {
                    // 获取返回值
                    var dataStr:String = (event.target as URLLoader).data;
                    trace(dataStr);
                    
                    // 解析JSON对象
                    var dataObj:Object = JSON.parse(dataStr);
                    if ("ok" == dataObj.result)
                    {
                        trace(dataObj.greeting);
                    }
                }
                catch (error:Error)
                {
                    trace("An Error Occur! Error Message is :" + error.message);
                    trace(error.getStackTrace());
                }
            }
        }
    }
}