2009-1-15 19:01:19 org.apache.catalina.core.StandardContext listenerStart
严重: 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 'compassIndexBuilder' defined in ServletContext resource [/WEB-INF/applicationContext-compass.xml]: Cannot resolve reference to bean 'compassGps' while setting bean property 'compassGps'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'compassGps' defined in ServletContext resource [/WEB-INF/applicationContext-compass.xml]: Invocation of init method failed; nested exception is java.lang.ClassCastException: $Proxy6
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'compassGps' defined in ServletContext resource [/WEB-INF/applicationContext-compass.xml]: Invocation of init method failed; nested exception is java.lang.ClassCastException: $Proxy6
Caused by: java.lang.ClassCastException: $Proxy6
at org.compass.gps.device.hibernate.lifecycle.DefaultHibernateEntityLifecycleInjector.injectLifecycle(DefaultHibernateEntityLifecycleInjector.java:95)
at org.compass.gps.device.hibernate.HibernateGpsDevice.doStart(HibernateGpsDevice.java:149)
at org.compass.gps.device.AbstractGpsDevice.start(AbstractGpsDevice.java:125)
at org.compass.gps.device.support.parallel.AbstractParallelGpsDevice.start(AbstractParallelGpsDevice.java:73)
at org.compass.gps.device.AbstractGpsDeviceWrapper.start(AbstractGpsDeviceWrapper.java:65)
at org.compass.gps.impl.AbstractCompassGps.start(AbstractCompassGps.java:166)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1241)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1206)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1172)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:428)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:261)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:109)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1100)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:862)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:424)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:287)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:244)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:187)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3827)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4336)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:761)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:741)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1206)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1307)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)
at java.lang.Thread.run(Unknown Source)

解决方案 »

  1.   

    applicationContext-compass.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"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
    default-lazy-init="true">
    <bean id="annotationConfiguration"
    class="org.compass.annotations.config.CompassAnnotationsConfiguration">
    </bean>
    <bean id="compass" class="org.compass.spring.LocalCompassBean">
    <property name="resourceDirectoryLocations">
    <list>
    <value>classpath:com/test</value>
    </list>
    </property>
    <property name="connection">
    <value>/lucene/indexes</value>
    </property>
    <property name="classMappings">
    <list>
    <value>com.test.model.Product</value>
    </list>
    </property>
    <property name="compassConfiguration"
    ref="annotationConfiguration" /> <property name="compassSettings">
    <props>
    <prop key="compass.transaction.factory">
    org.compass.spring.transaction.SpringSyncTransactionFactory
    </prop>
      <prop key="compass.engine.analyzer.MMAnalyzer.CustomAnalyzer">net.paoding.analysis.analyzer.PaodingAnalyzer </prop>
        <!-- 配置高亮为红色 -->
         <prop
          key="compass.engine.highlighter.default.formatter.simple.pre">
          <![CDATA[<font color="red"><b>]]>
         </prop>
         <prop
          key="compass.engine.highlighter.default.formatter.simple.post">
          <![CDATA[</b></font>]]>
         </prop>
        </props>
      </property> <property name="transactionManager" ref="transactionManager" />
    </bean>
    <bean id="hibernateGpsDevice"
    class="org.compass.gps.device.hibernate.HibernateGpsDevice">
    <property name="name">
    <value>hibernateDevice</value>
    </property>
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="mirrorDataChanges">
    <value>true</value>
    </property>
    </bean>
    <!-- 同步更新索引 -->
    <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
    init-method="start" destroy-method="stop">
    <property name="compass" ref="compass" />
    <property name="gpsDevices">
    <list>
    <bean
    class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
    <property name="gpsDevice" ref="hibernateGpsDevice" />
    </bean>
    </list>
    </property>
    </bean>

    <bean id="compassTemplate"
    class="org.compass.core.CompassTemplate">
    <property name="compass" ref="compass" />
    </bean> <!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 -->
    <bean id="compassIndexBuilder"
    class="com.test.service.impl.CompassIndexBuilder"
    lazy-init="false">
    <property name="compassGps" ref="compassGps" />
    <property name="buildIndex" value="true" />
    <property name="lazyTime" value="10" />
    </bean></beans>
      

  2.   

    错误主要是下面两个bean(对应的类)引起的
    <!-- 同步更新索引 --> 
    <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" 
    init-method="start" destroy-method="stop"> 
    <property name="compass" ref="compass" /> 
    <property name="gpsDevices"> 
    <list> 
    <bean 
    class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper"> 
    <property name="gpsDevice" ref="hibernateGpsDevice" /> 
    </bean> 
    </list> 
    </property> 
    </bean> <bean id="compassIndexBuilder" 
    class="com.test.service.impl.CompassIndexBuilder" 
    lazy-init="false"> 
    <property name="compassGps" ref="compassGps" /> 
    <property name="buildIndex" value="true" /> 
    <property name="lazyTime" value="10" /> 
    </bean> 
    尝试以下修改:
    compassIndexBuilder里compassGps属性的类型改成org.compass.gps.impl.SingleCompassGps所实现的接口。并加上set方法
    org.compass.gps.impl.SingleCompassGps所实现的接口里有没有start方法,stop方法
      

  3.   

    <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
      init-method="start" destroy-method="stop">
      <property name="compass" ref="compass" />
      <property name="gpsDevices">
       <list>
        <bean
         class="org.compass.spring.device.hibernate.dep.SpringHibernate3GpsDevice">
         <property name="name" value="hibernateDevice" />
         <property name="sessionFactory"
          ref="sessionFactory" />
        </bean>
       </list>
      </property>
     </bean>我把上面两个bean合成这个就不提示错误,但是搜索功能不好使,在hits.length()为0,这么改是在跟本上把错误改了吗?
      

  4.   

    我看源码了,compassGps就是org.compass.gps.impl.SingleCompassGps所实现的接口。
    而且在这个接口中定义了start,stop方法。
    我也在com.test.service.impl.CompassIndexBuilder这个类中设置了compassGps的setter方法了。继续求助各位高人!!!!!!!!!!!!!
      

  5.   

    类CompassIndexBuilder中的compassGps属性声明为SingleCompassGps所实现的接口
    private SingleCompassGps所实现的接口 compassGps;
    而不是
    private  SingleCompassGps compassGps
      

  6.   


    说实话,我没太理解你的意思,我贴一下CompassIndexBuilder:package com.test.service.impl;
    import org.compass.gps.CompassGps;
    import org.springframework.beans.factory.InitializingBean;
    /**
     * 通过quartz定时调度定时重建索引或自动随Spring ApplicationContext启动而重建索引的Builder.
     * 会启动后延时数秒新开线程调用compassGps.index()函数.
     * 默认会在Web应用每次启动时重建索引,可以设置buildIndex属性为false来禁止此功能.
     * 也可以不用本Builder, 编写手动调用compassGps.index()的代码.
     *
     */
    public class CompassIndexBuilder implements InitializingBean {   
    // 是否需要建立索引,可被设置为false使本Builder失效.
        private boolean buildIndex = false;    // 索引操作线程延时启动的时间,单位为秒
        private int lazyTime = 10;    // Compass封装
        private CompassGps compassGps;    // 索引线程
        private Thread indexThread = new Thread() {        @Override
            public void run() {
                try {
                    Thread.sleep(lazyTime * 1000);
                    System.out.println("begin compass index...");
                    long beginTime = System.currentTimeMillis();
                    // 重建索引.
                    // 如果compass实体中定义的索引文件已存在,索引过程中会建立临时索引,
                    // 索引完成后再进行覆盖.
                    compassGps.index();
                    long costTime = System.currentTimeMillis() - beginTime;
                    System.out.println("compss index finished.");
                    System.out.println("costed " + costTime + " milliseconds");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };    /**
         * 实现<code>InitializingBean</code>接口,在完成注入后调用启动索引线程.
         *
         * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
         */
        public void afterPropertiesSet() throws Exception {
            if (buildIndex) {
                indexThread.setDaemon(true);
                indexThread.setName("Compass Indexer");
                indexThread.start();
            }
        }    public void setBuildIndex(boolean buildIndex) {
            this.buildIndex = buildIndex;
        }    public void setLazyTime(int lazyTime) {
            this.lazyTime = lazyTime;
        }    public void setCompassGps(CompassGps compassGps) {
            this.compassGps = compassGps;
        }
    }
      

  7.   

    wlh86618 ,你的代码是不是参考 v512工作室发布的Struts2_Hibernate_Spring_Compass整合开发视频,我刚刚在看这段视频,遇到的问题跟你的一模一样,请问 问题解决了吗?
    视频中有个配置文件paoding-dic-home.properties里面的配置lucene paoding 搜索算法,你是怎么配置的?
    paoding.dic.home=C:/paoding/dic
    paoding.dic.detector.interval=60
    继续关注,
      

  8.   


    paoding不是搜索算法,是中文分词,那个目录是配置词典的~
      

  9.   


     // Compass封装
        private CompassGps compassGps;
    你这里的compassGps对象的类型是CompassGps ,把他换成CompassGps 类所实现地接口
    比如类CompassGps 是这样的:public class CompassGps implements someInterface {...}既实现接口someInterface 
    那么把CompassIndexBuilder 里的private CompassGps compassGps;
    换成 private someInterface compassGps;
       对应的get,set方法也换掉 
        public void setCompassGps(someInterface compassGps) {
            this.compassGps = compassGps;
        }
    这样改下,然后试试
      

  10.   

    // Compiled from CompassGps.java (version 1.5 : 49.0, no super bit)
    public abstract interface org.compass.gps.CompassGps {
      
      // Method descriptor #4 (Lorg/compass/gps/CompassGpsDevice;)V
      public abstract void addGpsDevice(org.compass.gps.CompassGpsDevice arg0);
      
      // Method descriptor #6 ([Lorg/compass/gps/CompassGpsDevice;)V
      public abstract void setGpsDevices(org.compass.gps.CompassGpsDevice[] arg0);
      
      // Method descriptor #8 ()V
      public abstract void start() throws org.compass.gps.CompassGpsException;
      
      // Method descriptor #8 ()V
      public abstract void stop() throws org.compass.gps.CompassGpsException;
      
      // Method descriptor #13 ()Z
      public abstract boolean isRunning();
      
      // Method descriptor #13 ()Z
      public abstract boolean isPerformingIndexOperation();
      
      // Method descriptor #8 ()V
      public abstract void index() throws org.compass.gps.CompassGpsException, java.lang.IllegalStateException;
      
      // Method descriptor #17 ([Ljava/lang/Class;)V
      public abstract void index(java.lang.Class... arg0) throws org.compass.gps.CompassGpsException, java.lang.IllegalStateException;
      
      // Method descriptor #18 ([Ljava/lang/String;)V
      public abstract void index(java.lang.String... arg0) throws org.compass.gps.CompassGpsException, java.lang.IllegalStateException;
      
      // Method descriptor #19 (Lorg/compass/gps/IndexPlan;)V
      public abstract void index(org.compass.gps.IndexPlan arg0) throws org.compass.gps.CompassGpsException, java.lang.IllegalStateException;
    }
    这是CompassGps的声明,它本身是个抽象接口,而且没有父接口啊,看来无法向上转型了。
      

  11.   

        // Compass封装
        private CompassGps compassGps;
    这么写,如果CompassGps是个接口的话,应该没有问题了
      

  12.   

    庖丁解牛的分词功能参考v512工作室的视频,在applicationContext-compass.xml里面没有实现。我是又配置了compass.cfg.xml才实现的。但是如何才能实现:输入查询语句的时候,把包含其中的部分查询语句的对象都查询出来?(例如查询:“中国北京” 的时候,将只包含“中国”的对象查询出来啊?)
    还有,楼主的xml在我的项目里面跑过了。没有问题的!!!可能是其他地方出了问题吧?