<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 167,  comments - 30,  trackbacks - 0

    不得不承認(rèn)的是,在目前的web應(yīng)用開發(fā)中,Spring的應(yīng)用越來越廣泛,其地位變得相當(dāng)重要。而在最近推出的Spring 3.2版本中,又引入了一些新的值得關(guān)注的特性。本文中將介紹其中一些值得關(guān)注的新特性。

    一 不再需要web.xml

     在新的Spring 3.2中,可以不再需要web.xml這個(gè)文件了,這得益于Servlet 3.0的新特性。

    其中,可以使用@WebServlet在需要調(diào)用的servlet中,使用注解去設(shè)置servlet中的映射關(guān)系。這樣的話,就可以不再象以往那樣要通過在web.xml中對(duì)servlet進(jìn)行配置,十分方便。

    此外,Servlet 3.0提供了既能在容器中動(dòng)態(tài)注冊(cè)servlet的方法,也提供了通過實(shí)現(xiàn)

    ServletContainerInitializer接口的方法實(shí)現(xiàn)在容器啟動(dòng)階段為容器動(dòng)態(tài)注冊(cè)Servlet、Filter和listeners。容器會(huì)在應(yīng)用的啟動(dòng)階段,調(diào)用所有實(shí)現(xiàn)ServletContainerInitializer接口類中的onStartup()方法。而Spring 3.2中,則進(jìn)一步簡(jiǎn)化了這點(diǎn),只需要實(shí)現(xiàn)WebApplicationInitializer接口就可以了,其中提供了一個(gè)相關(guān)的實(shí)現(xiàn)類--AbstractContextLoaderInitializer,它可以動(dòng)態(tài)注冊(cè)DispatcherServlet。這意味著,只要spring-webmvc.jar放置在web應(yīng)用的web-inf/lib中,就可以調(diào)用Dispatcher servlet了。可以參考如下的例子(來自Spring文檔):

    1. public class MyWebApplicationInitializer implements WebApplicationInitializer { 
    2.  
    3.     @Override 
    4.     public void onStartup(ServletContext container) { 
    5.         ServletRegistration.Dynamic registration = container.addServlet("dispatcher"new DispatcherServlet()); 
    6.         registration.setLoadOnStartup(1); 
    7.         registration.addMapping("/example/*"); 
    8.     } 
    9.  

    二 支持Java編程式配置在Spring mvc 3.2中,一個(gè)不錯(cuò)的特性就是在之前版本中支持使用Java代碼配置各種依賴注入的基礎(chǔ)上,進(jìn)一步簡(jiǎn)化了配置。關(guān)于使用Java編程式配置的好處,可以通過下面這個(gè)鏈接文章的介紹去學(xué)習(xí)

    http://blog.frankel.ch/consider-replacing-spring-xml-configuration-with-javaconfig)。
    在Spring mvc 3.2中,提供了AbstractContextLoaderInitialize的一個(gè)子類AbstractAnnotationConfigDispatcherServletInitializer去實(shí)現(xiàn)零XML配置的效果,只需要?jiǎng)?chuàng)建的類繼承AbstractAnnotationConfigDispatcherServletInitializer就可以了,如下代碼所示:

    1. public  
    2.  
    3. class  
    4.  
    5. SugarSpringWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
    6.  
    7.     @Override 
    8.     protected Class<?>[] getRootConfigClasses() { 
    9.         return new Class[] { JavaConfig.class }; 
    10.     } 
    11.  
    12.     @Override 
    13.     protected Class<?>[] getServletConfigClasses() { 
    14.         return new Class[] { WebConfig.class }; 
    15.     } 
    16.  
    17.     @Override 
    18.     protected String[] getServletMappings() { 
    19.         return new String[] { "/" }; 
    20.     } 
    21.  

    功能更強(qiáng)大的Spring Test 框架現(xiàn)在,單元測(cè)試顯得越來越重要了,每一個(gè)類都建議做好對(duì)應(yīng)的單元測(cè)試。在Spring 3.2版本之前,如果要對(duì)Spring MVC進(jìn)行單元測(cè)試的話,必須顯式去調(diào)用某個(gè)控制器類中的某個(gè)方法,而不能直接單元測(cè)試相關(guān)的mapping映射。而在Spring mvc 3.2中,重新整合和增強(qiáng)了測(cè)試框架的功能,支持直接用/*這樣的映射方式去測(cè)試某個(gè)控制器中的類。同時(shí),之前的開源項(xiàng)目(https://github.com/SpringSource/spring-test-mvc也被收錄到Spring mvc 3.2中去了。此外,還新增加了對(duì)返回(return),重定向(redirect)model等的測(cè)試改進(jìn),下面是一個(gè)例子:

    1. public class SayHelloControllerIT extends AbstractTestNGSpringContextTests { 
    2.   
    3.     private MockMvc mockMvc; 
    4.   
    5.     @BeforeMethod 
    6.     public void setUp() { 
    7.   
    8.         mockMvc = webAppContextSetup((WebApplicationContext) applicationContext).build(); 
    9.     } 
    10.   
    11.     @Test(dataProvider = "pathParameterAndExpectedModelValue"
    12.     public void accessingSayhelloWithSubpathShouldForwardToSayHelloJspWithModelFilled(String path, String value) throws Exception { 
    13.   
    14.         mockMvc.perform(get("/sayHello/Jo")).andExpect(view().name("sayHello")).andExpect(model().attribute("name""Jo")); 
    15.     } 

    本文的示例代碼可以在: http://blog.frankel.ch/wp-content/resources/spring-3-2-sweetness/spring-sweet-1.0.0.zip中下載。

    原文鏈接:http://java.dzone.com/articles/spring-32-sweetness

    posted @ 2013-07-10 11:48 David1228 閱讀(2346) | 評(píng)論 (0)編輯 收藏
         摘要: 本文轉(zhuǎn)載自:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html場(chǎng)景問題  舉個(gè)生活中常見的例子——組裝電腦,我們?cè)诮M裝電腦的時(shí)候,通常需要選擇一系列的配件,比如CPU、硬盤、內(nèi)存、主板、電源、機(jī)箱等。為討論使用簡(jiǎn)單點(diǎn),只考慮選擇CPU和主板的問題。  事實(shí)上,在選擇CPU的時(shí)候,面臨一系列的...  閱讀全文
    posted @ 2013-07-04 17:07 David1228 閱讀(400) | 評(píng)論 (0)編輯 收藏
    shell中可能經(jīng)常能看到:>/dev/null 2>&1 

    命令的結(jié)果可以通過%>的形式來定義輸出

    分解這個(gè)組合:“>/dev/null 2>&1” 為五部分。

    1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt
    2:/dev/null 代表空設(shè)備文件
    3:2> 表示stderr標(biāo)準(zhǔn)錯(cuò)誤
    4:& 表示等同于的意思,2>&1,表示2的輸出重定向等同于1
    5:1 表示stdout標(biāo)準(zhǔn)輸出,系統(tǒng)默認(rèn)值是1,所以">/dev/null"等同于 "1>/dev/null"

    因此,>/dev/null 2>&1 也可以寫成“1> /dev/null 2> &1”

    那么本文標(biāo)題的語句執(zhí)行過程為:
    1>/dev/null :首先表示標(biāo)準(zhǔn)輸出重定向到空設(shè)備文件,也就是不輸出任何信息到終端,說白了就是不顯示任何信息。
    2>&1 :接著,標(biāo)準(zhǔn)錯(cuò)誤輸出重定向 到 標(biāo)準(zhǔn)輸出,因?yàn)橹皹?biāo)準(zhǔn)輸出已經(jīng)重定向到了空設(shè)備文件,所以標(biāo)準(zhǔn)錯(cuò)誤輸出也重定向到空設(shè)備文件。

    最常用的方式有:
        
    command > file 2>file  與command > file 2>&1

    它們有什么不同的地方嗎?
          首先command > file 2>file 的意思是將命令所產(chǎn)生的標(biāo)準(zhǔn)輸出信息,和錯(cuò)誤的輸出信息送到file 中.command  > file 2>file 這樣的寫法,stdout和stderr都直接送到file中, file會(huì)被打開兩次,這樣stdout和stderr會(huì)互相覆蓋,這樣寫相當(dāng)使用了FD1和FD2兩個(gè)同時(shí)去搶占file 的管道。
          而command >file 2>&1 這條命令就將stdout直接送向file, stderr 繼承了FD1管道后,再被送往file,此時(shí),file 只被打開了一次,也只使用了一個(gè)管道FD1,它包括了stdout和stderr的內(nèi)容。
          從IO效率上,前一條命令的效率要比后面一條的命令效率要低,所以在編寫shell腳本的時(shí)候,較多的時(shí)候我們會(huì)command > file 2>&1 這樣的寫法。
     
    以上轉(zhuǎn)載自:http://sjolzy.cn/shell-in-the-dev-null-2-gt-amp-1-Detailed.html

    -
    -----------------------------------------------------------------------------------------------------
    那么,有這么個(gè)需求,我如何能判斷遠(yuǎn)程主機(jī)上的某個(gè)文件是否存在呢,我能想到的有兩種方法,一種方法可以使用expect腳本,但是需要遠(yuǎn)程主機(jī)上安裝expect包,但是只需要知道用戶名和密碼就可以了;第二種方法是要求兩臺(tái)主機(jī)之間做好ssh互信,然后如admin,那么通過shell可以直接判斷,但是文件宿主權(quán)限也需要是admin用戶下的。
    第二種方法腳本如下:
    #!/bin/bash

    ssh dst_host sh -s 2>&1 1>/dev/null <<EOF
    ls $NEW_DST_DIR
    EOF
    IS_EXIST=$?
    if [ "$IS_EXIST"x = "0"x ]; then
       echo "-The file exists------------------------------"
    else
       echo "No file-------------------------------"
    fi

    --大衛(wèi)





    posted @ 2013-07-02 14:45 David1228 閱讀(959) | 評(píng)論 (0)編輯 收藏
    OpenNebula中主機(jī)添加一切正常。
    執(zhí)行$onehost list 主機(jī)CPU、內(nèi)存資源可以正常被監(jiān)控到。但是,創(chuàng)建虛擬機(jī)后,虛擬機(jī)狀態(tài)很長(zhǎng)一段時(shí)間一直處于pend狀態(tài)。而OpenNebula的mm_sched調(diào)度虛擬機(jī)的周期是缺省30秒調(diào)度一次,根據(jù)調(diào)度算法適配一臺(tái)合適的主機(jī),主機(jī)是新添加的而且是有足夠資源的,為什么不能部署呢?
    我們可以通過查看虛擬機(jī)的調(diào)度日志$ONE_LOCATION/var/sched.log發(fā)現(xiàn)如下錯(cuò)誤信息:
    Tue Feb 21 [HOST][E]: Exception raised: Unable to transport XML to server and get XML response back.
     HTTP response: 504 Tue Feb 22 14:27:39 2011 [POOL][E]: Could not retrieve pool info from ONE。
    解決方法:
    在OpenNebula官方的Wiki中可以找到原因,原因是所添加的主機(jī)使用了HTTP代理上網(wǎng)了,所以O(shè)penNebula讀取了系統(tǒng)的http_proxy環(huán)境變量,此時(shí)就需要關(guān)閉http_proxy。

    I can create VMs, but sched.log shows the error "Could not retrieve pool info from ONE". What's wrong?

    If the scheduler does not deploy the pending VMs, and messages like these are found in sched.log

    [HOST][E]: Exception raised: Unable to transport XML to server and get XML response back.  HTTP response code is 404, not 200 [POOL][E]: Could not retrieve pool info from ONE

    Then you need to unset the http_proxy environment variable, or set the no_proxy accordingly.

    wiki參考地址(這里匯總了使用或部署one過程中可能遇到的問題以及解決辦法):http://wiki.opennebula.org/faq#listing_vms_takes_a_lot_of_time_why

    大家對(duì)于Opennebula的安裝部署感興趣的話,可以參考vpsee的博客(在Centos上安裝和部署Opennebula),講解的很詳細(xì)。

    vpsee已經(jīng)試玩了下OpenNebula4.0,由于項(xiàng)目原因,目前我們還在用OpenNebula3.8.1,后面也會(huì)測(cè)試升級(jí)到OpenNebula4.0看看新功能。
    升級(jí)過程同樣也參考下vpsee的OpenNebula3.x升級(jí)到OpenNebula4.0,^^ 這么好的資源優(yōu)先借鑒。

    posted @ 2013-06-24 18:01 David1228 閱讀(1083) | 評(píng)論 (0)編輯 收藏
    啟動(dòng)和停止OpenNebula shell腳本如下:
    給這個(gè)腳本起個(gè)名字吧,叫做oned

    #!/bin/bash
    #
    # chkconfig: 345 80 15
    # description: Startup script for the one .

    # Source function library.

    . /etc/rc.d/init.d/functions

    APP_USER=oneadmin
    APP_HOME=/opt/nebula/ONE/

    RETVAL=0

    start(){
            checkrun
            if [ $RETVAL -eq 1 ]; then
                    echo "Starting oned"
                    su - $APP_USER -c "$APP_HOME/bin/one start"
        else
           echo "oned is already running."

            fi
    }

    stop(){
            su - $APP_USER -c "$APP_HOME/bin/oneuser list" > /dev/null 2>&1
            result=$?
            if [ $result -eq 0 ]; then

                    echo "Shutting down oned"
                    su - $APP_USER -c "$APP_HOME/bin/one stop"

            elif [ $result -eq 255 ]; then

                    echo "Shutting down oned"
                    pkill -9 -u oneadmin

        fi
    }
       
    checkrun(){
            su - $APP_USER -c "$APP_HOME/bin/oneuser list" > /dev/null 2>&1
            if [ $? -eq 0 ]; then
                 RETVAL=0
                 return $RETVAL
        else
                 RETVAL=1
                 return $RETVAL
            fi
    }

    status(){
            checkrun
            if [ $RETVAL -eq 0 ]; then
                    echo "oned is running."
            else
                echo "oned is stopped."
                exit 1
            fi
    }

    case "$1" in
    start)
            start
            RETVAL=$?
            ;;
    stop)
            stop
            RETVAL=$?
            ;;
    restart)
            stop
            start
            RETVAL=$?
            ;;
    status)
            status
            ;;
    *)
            echo "Usage: $0 {start|stop|restart|status}"
            esac
    echo $RETVAL
    exit 0
    Linux中如何設(shè)置服務(wù)開機(jī)自啟動(dòng),可以參考http://os.51cto.com/art/201301/377515.htm

    1. 首先查看服務(wù)器默認(rèn)的運(yùn)行級(jí)別是多少? 目的是在對(duì)應(yīng)運(yùn)行級(jí)別下建立服務(wù)的軟連接。
     1> 執(zhí)行命令#runlevel
     [root@compute-63-14]# runlevel
     N 3
     2> 查看/etc/inittab
     [root@compute-63-14 tomcat6]# cat /etc/inittab 
     # inittab is only used by upstart for the default runlevel.
     ... ... 
     id:3:initdefault:
     
    2. 將寫好的oned腳本拷貝到/etc/init.d/目錄下

    3. 在/etc/rc.d/rc3.d中建立軟鏈接
    cd /etc/init.d/rc.d/rc3.d
    ln -s ../init.d/oned S99oned
    S99oned是其軟鏈接,S開頭代表加載時(shí)自啟動(dòng)

    以上已測(cè)試過,沒有問題,同時(shí)有興趣可以試試第二、三種方式。
    posted @ 2013-06-04 11:18 David1228 閱讀(424) | 評(píng)論 (0)編輯 收藏
    VNCServer X 桌面默認(rèn)為 twm, 這時(shí)連接進(jìn)去只能看到終端界面,而看不到遠(yuǎn)程桌面界面。可修改 /root/.vnc/xstartup 文件,將其改為 GNOME KDE 桌面:
    GNOME

    [root @ test vnc-4_1_2-x86_linux] # vi /root/.vnc/xstartup
    #
    /bin/sh
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot –solid grey
    vncconfig –iconic &
    xterm –geometry 80x24+10+10 –ls –title “$VNCDESKTOP Desktop” &
    gnome-session &

    KDE:
    [root @ test vnc-4_1_2-x86_linux] # vi /root/.vnc/xstartup
    #
    /bin/sh
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot –solid grey
    vncconfig –iconic &
    xterm –geometry 80x24+10+10 –ls –title “$VNCDESKTOP Desktop” &
    startkde &
    修改完畢后須重新啟動(dòng) VNCServer
    [root @ test vnc-4_1_2-x86_linux] # vncserver –kill :1 && vncserver :1
    [root @ test vnc-4_1_2-x86_linux] # vncviewer 192.168.98.32:1
    連接后即可使用 GNOME KDE 桌面啦(就像 WinXP 的遠(yuǎn)程桌面一般),也可以通過 WEB 訪問,在瀏覽器中輸入http://192.168.0.252:5801 即可,VNC 默認(rèn)的端口號(hào)為5801

    轉(zhuǎn)載:http://shaoruisky.blog.163.com/blog/static/92610707201151224518579/
    posted @ 2013-03-24 13:07 David1228 閱讀(2813) | 評(píng)論 (0)編輯 收藏
    Spring2.5繼續(xù)堅(jiān)持了這個(gè)發(fā)展趨向,特別是為那些使用Java 5或更新版本java的開發(fā)人員提供了進(jìn)一步簡(jiǎn)化而強(qiáng)大的新特性。這些新特性包括:注解驅(qū)動(dòng)的依賴性注入(annotation-driven dependency injection),使用注解而非XML元數(shù)據(jù)來自動(dòng)偵測(cè)classpath上的Spring組件,注解對(duì)生命周期方法的支持,一個(gè)新的web控制器模型將請(qǐng)求映射到加注解的方法上,在測(cè)試框架中支持Junit4,Spring XML命名空間的新增內(nèi)容,等等。
    項(xiàng)目中使用的spring2.5版本。如果想要使用spring提供的注解功能.
    applicationContext.xml配置文件中增加如下配置:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <!-- Using annontations -->
    <context:annotation-config></context:annotation-config>
    新增以下三項(xiàng)才可以使用注解功能
    xmlns:context="http://www.springframework.org/schema/context"
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <context:annotation-config></context:annotation-config>
    或者<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> 注冊(cè)一個(gè)單獨(dú)的Spring post-processor.
    一個(gè)沒有實(shí)現(xiàn)任何接口的業(yè)務(wù)類,配置如下:
    public class LogService extends Service{
    public LogBiz(){}
    @Resource //默認(rèn)按名稱查找bean. 如果找不到,則按類型匹配bean.
    private BaseDao dao;
    }
    tomcat啟動(dòng)錯(cuò)誤1:
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'logBiz': Injection of resource fields failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.ccms.base.dao.BaseDAO] is defined: expected single matching bean but found 40: [baseDAO, loginDAO, logDAO]
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessAfterInstantiation(CommonAnnotationBeanPostProcessor.java:291)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:876)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:437)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
    ... 32 more
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.ccms.base.dao.BaseDAO] is defined: expected single matching bean but found 40: [baseDAO, loginDAO, logDAO]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:583)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:418)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:497)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:145)
    at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:79)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessAfterInstantiation(CommonAnnotationBeanPostProcessor.java:288)
    ... 42 more
    使用@Resource默認(rèn)按名稱查找bean. 如果找不到,則按類型匹配bean.而名稱dao沒有找到,所以會(huì)根據(jù)BaseDAO匹配,但是BaseDAO是一個(gè)接口:
    <bean id="loginDAO" class="com.test.dao.loginDAO" parent="baseDAO" />
    <bean id="logDAO" class="com.test.dao.logDAO" parent="baseDAO" />
    <bean id="baseDAO" class="com.ccms.base.dao.BaseDAOImpl">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    <property name="simpleJdbcTemplate">
    <ref bean="simpleJdbcTemplate" />
    </property>
    </bean>
    有兩個(gè)實(shí)現(xiàn)了BaseDAO接口的類,所以spring就不知道應(yīng)該使用哪一個(gè)了。直接拋出異常。
    解決方法1:
    我們可以看到baseDAO名稱是唯一的, 所以如果想要按照名稱匹配,則直接寫baseDAO就可以了
    @Resource
    private BaseDAO baseDAO;
    解決方法2:
    @Autowired //默認(rèn)按照類型匹配,同樣應(yīng)為有兩個(gè)子類bean,所以拋出異常。
    @Qualifier("loginDAO") //限定bean
    private BaseDAO dao;
    參考博客:
    http://doc.chinaunix.net/java/200801/240056.shtml
    http://stackoverflow.com/questions/10534053/autowiring-two-beans-implementing-same-interface-how-to-set-default-bean-to-au
    posted @ 2013-03-21 10:22 David1228 閱讀(2493) | 評(píng)論 (0)編輯 收藏
         摘要: jdk并發(fā)部分,如果英文理解有點(diǎn)小難,可以參考http://www.yiibai.com/java6/java/util/concurrent/package-summary.html本篇轉(zhuǎn)自:http://victorzhzh.iteye.com/blog/1011635很多時(shí)候我們希望任務(wù)可以定時(shí)的周期性的執(zhí)行,在最初的JAVA工具類庫中,通過Timer可以實(shí)現(xiàn)定時(shí)的周期性的需求,但是有一定的...  閱讀全文
    posted @ 2013-03-18 18:58 David1228 閱讀(1769) | 評(píng)論 (0)編輯 收藏
    使用開源云工具OpenNebula3.8.1在KVM環(huán)境下虛擬機(jī)遷移失敗問題解決。
    1、虛擬機(jī)遷移失敗1日志:
    Fri Mar  8 17:57:18 2013 [LCM][I]: New VM state is SAVE_MIGRATE
    Fri Mar  8 17:57:30 2013 [VMM][I]: ExitCode: 0
    Fri Mar  8 17:57:30 2013 [VMM][I]: Successfully execute virtualization driver operation: save.
    Fri Mar  8 17:57:30 2013 [VMM][I]: ExitCode: 0
    Fri Mar  8 17:57:30 2013 [VMM][I]: Successfully execute network driver operation: clean.
    Fri Mar  8 17:58:14 2013 [LCM][I]: New VM state is PROLOG_MIGRATE
    Fri Mar  8 17:58:14 2013 [TM][I]: mv: -------------------------/one_images_3.8.1/0/42/disk.0
    Fri Mar  8 17:58:14 2013 [TM][I]: ExitCode: 0
    Fri Mar  8 18:02:28 2013 [TM][I]: mv: Moving bcec162:/one_images_3.8.1/0/42 to node153:/one_images_3.8.1/0/42
    Fri Mar  8 18:02:28 2013 [TM][I]: ExitCode: 0
    Fri Mar  8 18:02:29 2013 [LCM][I]: New VM state is BOOT
    Fri Mar  8 18:02:30 2013 [VMM][I]: ExitCode: 0
    Fri Mar  8 18:02:30 2013 [VMM][I]: Successfully execute network driver operation: pre.
    Fri Mar  8 18:02:33 2013 [VMM][I]: Command execution fail: /var/tmp/one/vmm/kvm/restore /one_images_3.8.1/0/42/checkpoint node153 42 node153
    Fri Mar  8 18:02:33 2013 [VMM][E]: restore: Command "virsh --connect qemu:///system restore /one_images_3.8.1/0/42/checkpoint" failed: error: Failed to restore domain from /one_images_3.8.1/0/42/checkpoint
    Fri Mar  8 18:02:33 2013 [VMM][I]: error: unable to set user and group to '0:0' on '/one_images_3.8.1/0/42/disk.1': No such file or directory
    Fri Mar  8 18:02:33 2013 [VMM][E]: Could not restore from /one_images_3.8.1/0/42/checkpoint
    Fri Mar  8 18:02:33 2013 [VMM][I]: ExitCode: 1
    Fri Mar  8 18:02:33 2013 [VMM][I]: Failed to execute virtualization driver operation: restore.
    Fri Mar  8 18:02:33 2013 [VMM][E]: Error restoring VM: Could not restore from /one_images_3.8.1/0/42/checkpoint
    Fri Mar  8 18:02:34 2013 [DiM][I]: New VM state is FAILED
    Sat Mar  9 09:23:46 2013 [DiM][I]: New VM state is DONE.
    Sat Mar  9 09:23:46 2013 [TM][W]: Ignored: LOG I 42 ExitCode: 0
    Sat Mar  9 09:23:47 2013 [TM][W]: Ignored: LOG I 42 delete: Deleting /one_images_3.8.1/0/42
    Sat Mar  9 09:23:47 2013 [TM][W]: Ignored: LOG I 42 ExitCode: 0
    Sat Mar  9 09:23:47 2013 [TM][W]: Ignored: TRANSFER SUCCESS 42 -
    解決方法:
    在mv腳本中TAR拷貝命令前面增加$SUDO命令.
    $ONE_LOCATION/var/remotes/tm/ssh/mv
    #!/bin/bash
    # -------------------------------------------------------------------------- #
    # Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org)             #
    #                                                                            #
    # Licensed under the Apache License, Version 2.0 (the "License"); you may    #
    # not use this file except in compliance with the License. You may obtain    #
    # a copy of the License at                                                   #
    #                                                                            #
    # http://www.apache.org/licenses/LICENSE-2.0                                 #
    #                                                                            #
    # Unless required by applicable law or agreed to in writing, software        #
    # distributed under the License is distributed on an "AS IS" BASIS,          #
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
    # See the License for the specific language governing permissions and        #
    # limitations under the License.                                             #
    #--------------------------------------------------------------------------- #
    # MV <hostA:system_ds/disk.i|hostB:system_ds/disk.i> vmid dsid
    #    <hostA:system_ds/|hostB:system_ds/>
    #   - hostX is the target host to deploy the VM
    #   - system_ds is the path for the system datastore in the host
    #   - vmid is the id of the VM
    #   - dsid is the target datastore (0 is the system datastore)
    SRC=$1
    DST=$2
    VMID=$3
    DSID=$4
    if [ -z "${ONE_LOCATION}" ]; then
        TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh
    else
        TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
    fi
    . $TMCOMMON
    #-------------------------------------------------------------------------------
    # Return if moving a disk, we will move them when moving the whole system_ds
    # directory for the VM
    #-------------------------------------------------------------------------------
    SRC=`fix_dir_slashes $SRC`
    DST=`fix_dir_slashes $DST`
    SRC_PATH=`arg_path $SRC`
    DST_PATH=`arg_path $DST`
    SRC_HOST=`arg_host $SRC`
    DST_HOST=`arg_host $DST`
    DST_DIR=`dirname $DST_PATH`
    SRC_DS_DIR=`dirname  $SRC_PATH`
    SRC_VM_DIR=`basename $SRC_PATH`
    if [ `is_disk $DST_PATH` -eq 1 ]; then
        log "-------------------------$DST_PATH"
    exit 0
    fi
    if [ "$SRC" == "$DST" ]; then
        exit 0
    fi
    ssh_make_path "$DST_HOST" "$DST_DIR"
    log "Moving $SRC to $DST"
    ssh_exec_and_log "$DST_HOST" "rm -rf '$DST_PATH'" \
        "Error removing target path to prevent overwrite errors"
    TAR_COPY="$SSH $SRC_HOST '$SUDO $TAR -C $SRC_DS_DIR -cf - $SRC_VM_DIR'"
    TAR_COPY="$TAR_COPY | $SSH $DST_HOST '$TAR -C $DST_DIR -xf -'"
    exec_and_log "eval $TAR_COPY" "Error copying disk directory to target host"
    exec_and_log "$SSH $SRC_HOST rm -rf $SRC_PATH"
    exit 0
    -------------------------------------------------------------------------------------------
    2、虛擬機(jī)遷移失敗2日志:
    Sat Mar  9 09:34:12 2013 [LCM][I]: New VM state is SAVE_MIGRATE
    Sat Mar  9 09:34:24 2013 [VMM][I]: ExitCode: 0
    Sat Mar  9 09:34:24 2013 [VMM][I]: Successfully execute virtualization driver operation: save.
    Sat Mar  9 09:34:24 2013 [VMM][I]: ExitCode: 0
    Sat Mar  9 09:34:24 2013 [VMM][I]: Successfully execute network driver operation: clean.
    Sat Mar  9 09:34:25 2013 [LCM][I]: New VM state is PROLOG_MIGRATE
    Sat Mar  9 09:34:25 2013 [TM][I]: mv: -------------------------/one_images_3.8.1/0/43/disk.0
    Sat Mar  9 09:34:25 2013 [TM][I]: ExitCode: 0
    Sat Mar  9 09:36:38 2013 [TM][I]: mv: Moving node153:/one_images_3.8.1/0/43 to bcec162:/one_images_3.8.1/0/43
    Sat Mar  9 09:36:38 2013 [TM][I]: mv: -------------------target copyy
    Sat Mar  9 09:36:38 2013 [TM][I]: mv: ++++++++++++++++++++++end copy
    Sat Mar  9 09:36:38 2013 [TM][I]: ExitCode: 0
    Sat Mar  9 09:36:38 2013 [LCM][I]: New VM state is BOOT
    Sat Mar  9 09:36:38 2013 [VMM][I]: ExitCode: 0
    Sat Mar  9 09:36:38 2013 [VMM][I]: Successfully execute network driver operation: pre.
    Sat Mar  9 09:36:42 2013 [VMM][I]: Command execution fail: /var/tmp/one/vmm/kvm/restore /one_images_3.8.1/0/43/checkpoint bcec162 43 bcec162
    Sat Mar  9 09:36:42 2013 [VMM][E]: restore: Command "virsh --connect qemu:///system restore /one_images_3.8.1/0/43/checkpoint" failed: error: Failed to restore domain from /one_images_3.8.1/0/43/checkpoint
    Sat Mar  9 09:36:42 2013 [VMM][I]: error: internal error process exited while connecting to monitor: Supported machines are:
    Sat Mar  9 09:36:42 2013 [VMM][I]: pc         RHEL 6.0.0 PC (alias of rhel6.0.0)
    Sat Mar  9 09:36:42 2013 [VMM][I]: rhel6.0.0  RHEL 6.0.0 PC (default)
    Sat Mar  9 09:36:42 2013 [VMM][I]: rhel5.5.0  RHEL 5.5.0 PC
    Sat Mar  9 09:36:42 2013 [VMM][I]: rhel5.4.4  RHEL 5.4.4 PC
    Sat Mar  9 09:36:42 2013 [VMM][I]: rhel5.4.0  RHEL 5.4.0 PC
    Sat Mar  9 09:36:42 2013 [VMM][E]: Could not restore from /one_images_3.8.1/0/43/checkpoint
    Sat Mar  9 09:36:42 2013 [VMM][I]: ExitCode: 1
    Sat Mar  9 09:36:42 2013 [VMM][I]: Failed to execute virtualization driver operation: restore.
    Sat Mar  9 09:36:42 2013 [VMM][E]: Error restoring VM: Could not restore from /one_images_3.8.1/0/43/checkpoint
    Sat Mar  9 09:36:42 2013 [DiM][I]: New VM state is FAILED
    登陸到節(jié)點(diǎn):
    [root@bcec162 43]# virsh restore checkpoint 
    錯(cuò)誤:從 checkpoint 恢復(fù)域失敗
    錯(cuò)誤:internal error process exited while connecting to monitor: Supported machines are:
    pc         RHEL 6.0.0 PC (alias of rhel6.0.0)
    rhel6.0.0  RHEL 6.0.0 PC (default)
    rhel5.5.0  RHEL 5.5.0 PC
    rhel5.4.4  RHEL 5.4.4 PC
    rhel5.4.0  RHEL 5.4.0 PC
    修改了bcec162節(jié)點(diǎn)的/etc/libvirt/qemu.conf文件:
    # The user ID for QEMU processes run by the system instance
    user = "root"
    # The group ID for QEMU processes run by the system instance
    group = "root"
    # Whether libvirt should dynamically change file ownership
    # to match the configured user/group above. Defaults to 1.
    # Set to 0 to disable file ownership changes.
    #dynamic_ownership = 0
    bcec162節(jié)點(diǎn)遷移到node153節(jié)點(diǎn)成功。
    [root@node153 43]# ll
    total 5075464
    -rw-r--r-- 1 root     root  287215779 Mar  8 11:11 checkpoint
    -rw-r--r-- 1 oneadmin kvm   283538737 Mar  9 09:34 checkpoint.1362712278
    -rw-r--r-- 1 oneadmin kvm         920 Mar  9 09:26 deployment.0
    -rw-r--r-- 1 root     root 4621008896 Mar  9 10:14 disk.0
    -rw-r----- 1 root     root     401408 Mar  9 09:26 disk.1
    lrwxrwxrwx 1 oneadmin kvm          29 Mar  9 10:09 disk.1.iso -> /one_images_3.8.1/0/43/disk.1
    --------------------------------------------------------------------------------------------------------
    3、僅修改node152節(jié)點(diǎn)的/etc/libvirt/qemu.conf文件:
    # The user ID for QEMU processes run by the system instance
    #user = "root"
    # The group ID for QEMU processes run by the system instance
    #group = "root"
    # Whether libvirt should dynamically change file ownership
    # to match the configured user/group above. Defaults to 1.
    # Set to 0 to disable file ownership changes.
    dynamic_ownership = 0
    從bcec162節(jié)點(diǎn)遷移到node152不成功,日志如下:
    Sat Mar  9 10:31:47 2013 [LCM][I]: New VM state is SAVE_MIGRATE
    Sat Mar  9 10:31:54 2013 [VMM][I]: save: Moving old checkpoint file /one_images_3.8.1/0/43/checkpoint
    Sat Mar  9 10:31:54 2013 [VMM][I]: ExitCode: 0
    Sat Mar  9 10:31:54 2013 [VMM][I]: Successfully execute virtualization driver operation: save.
    Sat Mar  9 10:31:54 2013 [VMM][I]: ExitCode: 0
    Sat Mar  9 10:31:54 2013 [VMM][I]: Successfully execute network driver operation: clean.
    Sat Mar  9 10:31:55 2013 [LCM][I]: New VM state is PROLOG_MIGRATE
    Sat Mar  9 10:31:55 2013 [TM][I]: mv: -------------------------/one_images_3.8.1/0/43/disk.0
    Sat Mar  9 10:31:55 2013 [TM][I]: ExitCode: 0
    Sat Mar  9 10:35:02 2013 [TM][I]: mv: Moving bcec162:/one_images_3.8.1/0/43 to node152:/one_images_3.8.1/0/43
    Sat Mar  9 10:35:02 2013 [TM][I]: mv: -------------------target copyy
    Sat Mar  9 10:35:02 2013 [TM][I]: mv: ++++++++++++++++++++++end copy
    Sat Mar  9 10:35:02 2013 [TM][I]: ExitCode: 0
    Sat Mar  9 10:35:02 2013 [LCM][I]: New VM state is BOOT
    Sat Mar  9 10:35:03 2013 [VMM][I]: ExitCode: 0
    Sat Mar  9 10:35:03 2013 [VMM][I]: Successfully execute network driver operation: pre.
    Sat Mar  9 10:35:07 2013 [VMM][I]: Command execution fail: /var/tmp/one/vmm/kvm/restore /one_images_3.8.1/0/43/checkpoint node152 43 node152
    Sat Mar  9 10:35:07 2013 [VMM][E]: restore: Command "virsh --connect qemu:///system restore /one_images_3.8.1/0/43/checkpoint" failed: error: Failed to restore domain from /one_images_3.8.1/0/43/checkpoint
    Sat Mar  9 10:35:07 2013 [VMM][I]: error: operation failed: failed to retrieve chardev info in qemu with 'info chardev'
    Sat Mar  9 10:35:07 2013 [VMM][E]: Could not restore from /one_images_3.8.1/0/43/checkpoint
    Sat Mar  9 10:35:07 2013 [VMM][I]: ExitCode: 1
    Sat Mar  9 10:35:07 2013 [VMM][I]: Failed to execute virtualization driver operation: restore.
    Sat Mar  9 10:35:07 2013 [VMM][E]: Error restoring VM: Could not restore from /one_images_3.8.1/0/43/checkpoint
    Sat Mar  9 10:35:07 2013 [DiM][I]: New VM state is FAILED
    登陸到node152節(jié)點(diǎn)執(zhí)行restore命令:
    [root@node152 43]# virsh restore checkpoint
    error: Failed to restore domain from checkpoint
    error: internal error process exited while connecting to monitor: qemu: could not open disk image /one_images_3.8.1/0/43/disk.0: Permission denied
    將/etc/libvirt/qemu.conf文件中注釋掉dynamic_ownership=0,開啟user=root和group=root. 
    如果開啟dynamic_ownership則恢復(fù)虛擬機(jī)也會(huì)報(bào)出上面的錯(cuò)誤信息。
    在node152節(jié)點(diǎn)上恢復(fù)虛擬機(jī):
    [root@node152 43]# virsh restore checkpoint
    Domain restored from checkpoint
    [root@node152 43]# virsh list
     Id Name                 State
    ----------------------------------
    117 one-43               running
    參考文章:
    https://wiki.archlinux.org/index.php/QEMU_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
    http://hi.baidu.com/juacm/item/f1fc3f98d8428ad07a7f01e2

    轉(zhuǎn)載請(qǐng)保持原鏈接:http://m.tkk7.com/ldwblog/archive/2013/03/08/396187.html
    posted @ 2013-03-08 12:03 David1228 閱讀(762) | 評(píng)論 (0)編輯 收藏
    項(xiàng)目組內(nèi)一位同事,在重構(gòu)代碼過程中將幾個(gè)模塊的Service層接口去掉后. 修改成了沒有實(shí)現(xiàn)任何接口的類,并且繼承了一個(gè)抽象基類。
    然后我更新代碼后執(zhí)行系統(tǒng)中的該模塊,發(fā)現(xiàn)部分表數(shù)據(jù)沒有完整持久到數(shù)據(jù)庫中。看了下代碼和spring配置文件,原來調(diào)整后的Biz的業(yè)務(wù)類沒有配置事務(wù)導(dǎo)致的。
    修改了下spring配置文件(beanNames綁定了*Biz):
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
        <bean id= "propertyConfigurer"          
            class 
    = "com.ccms.base.util.DecryptPropertyPlaceholderConfigurer" >          
         <property name="locations" value= "classpath:sysConfig.properties" />          
       </bean>      
        <!-- 
       <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName">
                <value>com.mysql.jdbc.Driver</value>
            </property>
            <property name="url">
                <value>${dataSource.jdbcUrl}&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
            </property>
            <property name="username">
                <value>${dataSource.userName}</value>
            </property>
            <property name="password">
                <value>${dataSource.password}</value>
            </property>
            <property name="maxActive">
                <value>100</value>
            </property>
            <property name="initialSize">
                <value>5</value>
            </property>
            <property name="maxIdle">
                <value>10</value>
            </property>
            <property name="minIdle">
                <value>0</value>
            </property>
            <property name="maxWait">
                <value>-1</value>
            </property>
            <property name="defaultAutoCommit">
                <value>false</value>
            </property>
            <property name="testOnBorrow">
                <value>true</value>
            </property>
            <property name="testWhileIdle">
                <value>true</value>
            </property>
            <property name="timeBetweenEvictionRunsMillis">
                <value>600000</value>
            </property>
            <property name="numTestsPerEvictionRun">
                <value>20</value>
            </property>
            <property name="minEvictableIdleTimeMillis">
                <value>3600000</value>
            </property>
        </bean>
       
    -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="${dataSource.jdbcUrl}&amp;useUnicode=true&amp;characterEncoding=UTF-8" />
            <property name="user" value="${dataSource.userName}" />
            <property name="password" value="${dataSource.password}" />
              <property name="minPoolSize" value="5" />
            <property name="maxPoolSize" value="50" />
            <property name="maxStatements" value="0" />
            <property name="idleConnectionTestPeriod" value="60" />
            <property name="acquireRetryAttempts" value="3" />
        </bean>

        <!-- Session Factory -->
        <bean id="sessionFactory"
            class
    ="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource">
                <ref local="dataSource" />
            </property>
        <!-- hbm配置文件的classPath路徑 -->
            <property name="mappingDirectoryLocations">
                <list>
                    <value>classpath:/com/ccms/base/mapping</value>
                </list>
            </property>

            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.generate_statistics">true</prop>
                    <prop key="hibernate.connection.release_mode">auto</prop>
                    <prop key="hibernate.autoReconnect">true</prop> 
                    <prop key="hibernate.connection.autocommit">false</prop>
                    <!-- <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop> -->
                </props>
            </property>
        </bean>

        <bean id="myTransactionManager"
            class
    ="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory">
                <ref bean="sessionFactory" />
            </property>
        </bean> 

        <bean id="transactionInterceptor"
            class
    ="org.springframework.transaction.interceptor.TransactionInterceptor">
            <property name="transactionManager" ref="myTransactionManager" />
            <property name="transactionAttributes">
                <props>
                    <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
                </props>
            </property>
        </bean>
        <bean  class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
            <property name="transactionInterceptor"
                ref
    ="transactionInterceptor" />
        </bean>
        <bean
            
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
            <property name="beanNames">
                <list>
                    <value>*Service</value>
                    <value>*Biz</value>
                </list>
            </property>
            <property name="interceptorNames">
                <list>
                    <value>transactionInterceptor</value>
                </list>
            </property>
        </bean>
    </beans>

    啟動(dòng)tomcat后報(bào)出如下錯(cuò)誤信息:
    [2013-03-05 10:36:56] [ERROR] Context initialization failed - at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:215) 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginBiz' defined in ServletContext resource [/WEB-INF/spring-service-resource.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:445)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:433)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:331)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1266)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)
    ... 28 more
    Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
    at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
    at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
    ... 34 more
    2013-3-5 10:36:56 org.apache.catalina.core.StandardContext listenerStart
    嚴(yán)重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginBiz' defined in ServletContext resource [/WEB-INF/spring-service-resource.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:445)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:433)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:331)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1266)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)
    ... 28 more
    Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
    at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
    at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
    ... 34 more
    2013-3-5 10:36:56 org.apache.catalina.core.StandardContext start

    ------------------------------------------
    通過以上錯(cuò)誤分析之:對(duì)于實(shí)現(xiàn)了接口的類,直接用了JDK的動(dòng)態(tài)代理,把目標(biāo)對(duì)象扔給JDK的Proxy,拿到代理對(duì)象就OK了。然而對(duì)于沒有實(shí)現(xiàn)接口的類,Spring借助于CGLIB來實(shí)現(xiàn)代理。
    解決辦法:
    當(dāng)使用CGLIB來實(shí)現(xiàn)代理后,沒有實(shí)現(xiàn)接口的類
    1、 通過構(gòu)造函數(shù)形式注入時(shí)必須有默認(rèn)的構(gòu)造函數(shù),否則就會(huì)出現(xiàn)上面的異常。
    2、通過生產(chǎn)setter或者getter方法注入。
    3、通過修改Spring的CglibProxyFactory工廠類。

    詳細(xì)解析可以參照這篇文章:http://netfork.iteye.com/blog/286215
    posted @ 2013-03-05 14:54 David1228 閱讀(10768) | 評(píng)論 (0)編輯 收藏
    僅列出標(biāo)題
    共16頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章檔案

    新聞分類

    新聞檔案

    相冊(cè)

    收藏夾

    Java

    Linux知識(shí)相關(guān)

    Spring相關(guān)

    云計(jì)算/Linux/虛擬化技術(shù)/

    友情博客

    多線程并發(fā)編程

    開源技術(shù)

    持久層技術(shù)相關(guān)

    搜索

    •  

    積分與排名

    • 積分 - 358723
    • 排名 - 154

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲另类春色校园小说| baoyu116.永久免费视频| 五月婷婷综合免费| 亚洲国产精久久久久久久| 久久久精品视频免费观看| 亚洲精品偷拍视频免费观看| 亚洲AV无码一区二区三区久久精品 | 国产精品无码素人福利免费| 亚洲免费福利视频| 99xxoo视频在线永久免费观看| 国产亚洲精品成人AA片新蒲金 | 国产亚洲精品无码拍拍拍色欲| 美国毛片亚洲社区在线观看| 免费高清在线爱做视频| 亚洲一区精彩视频| 青春禁区视频在线观看直播免费| 亚洲欧洲日韩国产| 59pao成国产成视频永久免费| 亚洲AV人无码激艳猛片| 国产免费一区二区三区在线观看| 中文字幕亚洲图片| 久久精品无码专区免费| 久久影视综合亚洲| 国产高潮久久免费观看| 久久久久亚洲av成人无码电影| 免费人成视频在线播放| 免费v片在线观看无遮挡| 狼色精品人妻在线视频免费| 又黄又爽一线毛片免费观看| 美女被羞羞网站免费下载| 国产一级淫片a免费播放口之 | 中文字幕专区在线亚洲| 中文在线免费观看| 亚洲AV一宅男色影视| 国产白丝无码免费视频| 亚洲美女色在线欧洲美女| 亚洲免费福利视频| 亚洲天堂电影在线观看| 无码视频免费一区二三区| 亚洲日本VA午夜在线电影| 国产成人免费片在线视频观看|