`
hanyibin
  • 浏览: 9310 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ssh+compass实现收索

阅读更多

照着v512 刘伟老师做了一个ssh 集成compass 的小程序  最后的感觉是compass   很好很强大,我把我其中遇到的问题写出来,也许大家也会遇到,省下不必要的麻烦。 

 

我的类库是 struts2+ hibernate3.2+spring2.5+ compass2.1

 

第一个问题,也是让我最崩溃的问题

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]: Cannot resolve reference to bean 'compass' while setting bean property 'compass'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'compass' defined in ServletContext resource [/WEB-INF/applicationContext-compass.xml]: Cannot resolve reference to bean 'transactionManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V


 

看到这么长的错,我首先感觉到的就是,自己的代码有问题,死劲的找没找到。在网上搜了一下发现原来这错挺常见,我就按别人的提示一个一个的试,最终在http://atao.iteye.com/blog/281282 找到了答案,是由于Spring中的“asm-2.2.3.jar”和Hibernate中的“asm.jar”包冲突。解决办法是移除Spring2.5 AOP Libraries中的“asm-2.2.3.jar”即可 。可是让我头痛的是怎么移除呢?MyEclipse 6.5 上要想单独移除asm-2.2.3 是不可能的,只能连spring 2.5 aop Libraries 一块移除,然后重新添加,这次选择直接添加.jar文件到lib 目录,但是我就怎么呀找到那个选择直接添加.jar文件的窗口选项在哪里,后来没办法只好在发布以后删除发布完成以后tomcat 对应目录下的asm-2.2.3.jar 。第一个问题就这样勉强的解决了。

 

第二个问题,

java.lang.IllegalArgumentException: Original must not be null

 有了这个问题,基本就能确定是spring 不能将对象注入的原因  一般是找不到对应的set 方法,我的错误是没写下面红颜色的set 方法。

package com.cntion.example.action;

import java.util.List;

import com.cntion.example.model.Product;
import com.cntion.example.service.ProductManager;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
/**
 * @author hsmiel
 *
 */
public class ProductAction extends ActionSupport {
	private ProductManager productManager;
	private Product product;
	private String queryString;
	
	public ProductManager getProductManager() {
		return productManager;
	}
	public void setProductManager(ProductManager productManager) {
		this.productManager = productManager;
	}
	public Product getProduct() {
		return product;
	}
	public void setProduct(Product product) {
		this.product = product;
	}
	public String getQueryString() {
		return queryString;
	}
	public void setQueryString(String queryString) {
		this.queryString = queryString;
	}
	
	
	

	public String insert(){
		productManager.insertProduct(product);
		return SUCCESS;
	}
	
	public String search(){
		List result=productManager.searchProduct(queryString);
		ServletActionContext.getRequest().setAttribute("searchresults",result);
		return SUCCESS;
	}




}

 

下面是我实现的关键代码 

 

1  每次启动自动生成索引  CompassIndexBuilder.java

package com.cntion.example.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;
    }
}

 

 2  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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" default-lazy-init="true">


	<!-- 定义数据源的Bean ,给Hibernate的sessionFactory-->
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="oracle.jdbc.driver.OracleDriver">
		</property>
		<property name="url"
			value="jdbc:oracle:thin:@localhost:1521:hsmile">
		</property>
		<property name="username" value="scott"></property>
		<property name="password" value="tiger"></property>
	</bean>
	
<!-- 定义Hibernate的sessionFactory,通过该Bean,可以获得Hibernate的Session-->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.Oracle9Dialect
				</prop>
				<!--设置二级缓冲-->
				<prop key="hibernate.cache.provider_class">
					org.hibernate.cache.EhCacheProvider
				</prop>
				<!--设置二级缓冲,打开查询缓冲-->
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<!--设置显示Hibernate操作的SQL语句-->
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>				
				<value>
					com/cntion/example/model/Product.hbm.xml
				</value>
			</list>
		</property>
	</bean>
	
	<!-- 注入依赖类  -->
	<bean id="productDao" class="com.cntion.example.dao.hibernate.ProductDaoHibernate">
	<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<bean id="productManager" class="com.cntion.example.service.impl.ProductManagerImpl">
	<property name="productDao" ref="productDao"></property>
	<property name="compassTemplate" ref="compassTemplate"></property>
	</bean>
	
	<bean id="productBean" class="com.cntion.example.action.ProductAction" scope="prototype">
	<property name="productManager" ref="productManager"></property>
	</bean>
	
			<!-- 配置事务管理器 -->	
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref local="sessionFactory"/>
		</property>
	</bean>
    
    <!-- 配置事务特性 ,配置add、delete和update开始的方法,事务传播特性为required-->       
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    	<tx:attributes>
    		<tx:method name="insert*" propagation="REQUIRED"/>
    		<tx:method name="delete*" propagation="REQUIRED"/>
    		<tx:method name="update*" propagation="REQUIRED"/>
    		<tx:method name="*" read-only="true"/>
    	</tx:attributes>
    </tx:advice>
    
    <!-- 配置那些类的方法进行事务管理,当前cn.com.jobedu.oa.service包中的子包、类中所有方法需要,还需要参考tx:advice的设置 -->
    <aop:config>
    	<aop:pointcut id="allManagerMethod" expression="execution (* com.cntion.example.service.*.*(..))"/>
    	<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
    </aop:config> 
</beans>

 

3   sprint 集成 compass 配置文件  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.5.xsd"
	default-lazy-init="true">


	<bean id="annotationConfiguration"
		class="org.compass.annotations.config.CompassAnnotationsConfiguration">
	</bean>

	<!-- org.compass.spring.LocalCompassBean -->
	<bean id="compass" class="org.compass.spring.LocalCompassBean">
		<property name="resourceDirectoryLocations">
			<list>
				<value>classpath:com/cntion</value>
			</list>
		</property>
		<property name="connection">
			<value>/lucene/indexes</value>
		</property>


		<property name="classMappings">
			<list>
				<value>com.cntion.example.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>
			</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.cntion.example.service.impl.CompassIndexBuilder"
		lazy-init="false">
		<property name="compassGps" ref="compassGps" />
		<property name="buildIndex" value="true" />
		<property name="lazyTime" value="10" />
	</bean>

</beans>

 

4  struts.xml

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<constant name="struts.objectFactory" value="spring" />

	<include file="struts-default.xml" />

	<package name="product" extends="struts-default"
		namespace="/product">
		<!-- 配置Struts2的Action,class值要与applicationContext*.xml中的id的值一致。 -->
		<action name="insert" class="productBean" method="insert">
			<result>insertOk.jsp</result>
		</action>
		<action name="search" class="productBean" method="search">
			<result>searchResults.jsp</result>
		</action>


	</package>

</struts>

 

5  收索方法  红颜色的地方是表示按照商品名称收索

	public List searchProduct(String queryString) {
		Compass compass=compassTemplate.getCompass();
		CompassSession session=compass.openSession();

		CompassHits hits=session.queryBuilder().queryString("name:"+queryString).toQuery().hits();
		List list=new ArrayList();
		
		for(int i=0;i<hits.length();i++){
			Product hit=(Product)hits.data(i);
			list.add(hit);
		}

		return list;
	}

 6  实体类

 

package com.cntion.example.model;
import org.compass.annotations.*;

/**
 * Product entity.
 * 
 * @author MyEclipse Persistence Tools
 */
@Searchable
public class Product implements java.io.Serializable {

	// Fields
	@SearchableId
	private String id;
	@SearchableProperty(name="name")
	private String name;
	@SearchableProperty(name="price")
	private Double price;
	@SearchableProperty(name="brand")
	private String brand;
	@SearchableProperty(name="description")
	private String description;

	// Constructors

	/** default constructor */
	public Product() {
	}

	/** full constructor */
	public Product(String name, Double price, String brand, String description) {
		this.name = name;
		this.price = price;
		this.brand = brand;
		this.description = description;
	}

	// Property accessors

	public String getId() {
		return this.id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Double getPrice() {
		return this.price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public String getBrand() {
		return this.brand;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public String getDescription() {
		return this.description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

}

 

其中很多地方我还是不太明白。.....继续努力。

分享到:
评论
3 楼 yangactive 2012-06-27  
sunting_bcwl 写道
我今天也看了那套视频,不错

视频在哪里呀?
2 楼 niu396212866 2010-05-20  
我老师正在让我弄这个东西,所以看到你说的有视频,真的很是激动啊!多多交流,有不会的地方还请多多帮忙!396212866@qq.com
1 楼 sunting_bcwl 2010-01-17  
我今天也看了那套视频,不错

相关推荐

    ssh+compass实现站内搜索分页.rar

    本教程将重点讲解如何使用SSH框架与Compass结合,实现在网站内的搜索分页功能。 首先,让我们深入了解SSH框架的每个组件: 1. **Struts2**:这是一个MVC(Model-View-Controller)架构的开源框架,用于控制应用...

    struts2+spring2.5+hibernate3.26+compass2.1搜索引擎简单实现(无jar包)

    在"struts2+spring2.5+hibernate3.26+compass2.1搜索引擎简单实现"这个项目中,首先你需要配置Struts2、Spring和Hibernate,确保它们能正常工作。这包括编写相应的配置文件(如struts.xml、spring-context.xml、...

    SSH+compass

    SSH+compass整合的小例子,导入即可运行,数据库用的是mysql,用的都是注解技术,代码良好,dao层用了江南白衣的思想,根据泛型和反射封装,可以做基类,里面有注册和查询的小例子,基本可以在此基础上继续开放你所...

    SSH2+compass2.2搜索实例(完整工程)

    通过研究这个SSH2+Compass2.2搜索实例,开发者可以学习到如何在J2EE应用中整合多个框架以实现复杂的功能,如搜索引擎集成。此外,还会了解如何使用MyEclipse这样的IDE进行开发,以及如何管理和部署SQL数据库。这是一...

    SSH+compass 整合

    本资源是struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0整合实例,可以为初学入门者,提供个参考,本人也是网上找的,感觉很不错(因其中所用的jar文件太大,无法上传,大家可以自己添加各框架...

    SSH2+compass的模糊查询

    关于ssh+compass的源码仿写,功能简单,可以参考研究。

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0产品搜索

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................

    S2SH+compass (实现站内全文检索)

    标题中的"S2SH+compass"指的是使用Struts2(S),Spring(S)和Hibernate(H)这三种开源框架的组合,再加上Compass搜索引擎库来实现一个网站内部的全文检索功能。这种组合常见于Java Web开发中,用于构建复杂、高...

    Lucene+compass学习资料

    例如,使用Compass将数据库中的数据同步到Lucene索引中,然后通过Ajax实现前端与后端的无刷新通信,当用户在搜索框中输入关键词时,立即向服务器发送请求,服务器利用Lucene进行查询,并用Ajax返回结果,这样就能在...

    struts2+hibernate3+spring3+compass

    struts2+spring3+hibernate3+compass实现全文检索功能,希望对初学者有所帮助!

    sass+compass生成基于rem的雪碧图

    总结起来,结合`SASS`和`Compass`,我们可以更方便地创建和管理基于`rem`单位的雪碧图,以实现更加灵活和响应式的网页设计。`Rem`单位的使用确保了在整个页面中的比例一致性,而雪碧图技术则提高了页面加载速度,...

    Compass+SSH搜索引擎简单项目

    【SSH+Compass搜索引擎简单项目】是一个基于Struts2(S),Hibernate(H)和Spring(S)的Java Web应用程序,结合了Compass搜索引擎库,用于实现对数据库中两个表的高效检索功能。这个项目旨在提供一个清晰易懂的...

    SSH2整合compass做搜索引挚

    SSH2和Compass整合构建搜索引擎是一个在Java Web开发中实现高效全文检索的常见技术实践。SSH2是指Spring、Struts2和Hibernate这三个开源框架的组合,它们分别负责控制层、表现层和持久层的处理。而Compass是一个基于...

    JAVA 全文搜索 struts2+spring+hibernte+compass整合记录

    在本项目中,"JAVA 全文搜索 struts2+spring+hibernate+compass整合记录" 是一个关于如何在Java环境下集成四个关键组件来实现全文搜索引擎的实践教程。Struts2是一个流行的MVC框架,Spring是核心的依赖注入框架,...

    spring + hibernate + struts2 + compass2.1

    Compass能够自动索引和搜索持久化对象,使得在Web应用中实现高效的数据检索变得简单。它支持实时索引更新,对数据库中的数据变化作出快速响应。 在提供的文件列表中,我们可以看到以下几个关键组件: - **compass-...

    Lucene+compass+spring+jdbc+庖丁的一个例子

    标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...

Global site tag (gtag.js) - Google Analytics