- 浏览: 9324 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yangactive:
sunting_bcwl 写道我今天也看了那套视频,不错视频在 ...
ssh+compass实现收索 -
niu396212866:
我老师正在让我弄这个东西,所以看到你说的有视频,真的很是激动啊 ...
ssh+compass实现收索 -
sunting_bcwl:
我今天也看了那套视频,不错
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; } }
其中很多地方我还是不太明白。.....继续努力。
评论
视频在哪里呀?
相关推荐
本教程将重点讲解如何使用SSH框架与Compass结合,实现在网站内的搜索分页功能。 首先,让我们深入了解SSH框架的每个组件: 1. **Struts2**:这是一个MVC(Model-View-Controller)架构的开源框架,用于控制应用...
在"struts2+spring2.5+hibernate3.26+compass2.1搜索引擎简单实现"这个项目中,首先你需要配置Struts2、Spring和Hibernate,确保它们能正常工作。这包括编写相应的配置文件(如struts.xml、spring-context.xml、...
SSH+compass整合的小例子,导入即可运行,数据库用的是mysql,用的都是注解技术,代码良好,dao层用了江南白衣的思想,根据泛型和反射封装,可以做基类,里面有注册和查询的小例子,基本可以在此基础上继续开放你所...
通过研究这个SSH2+Compass2.2搜索实例,开发者可以学习到如何在J2EE应用中整合多个框架以实现复杂的功能,如搜索引擎集成。此外,还会了解如何使用MyEclipse这样的IDE进行开发,以及如何管理和部署SQL数据库。这是一...
本资源是struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0整合实例,可以为初学入门者,提供个参考,本人也是网上找的,感觉很不错(因其中所用的jar文件太大,无法上传,大家可以自己添加各框架...
关于ssh+compass的源码仿写,功能简单,可以参考研究。
struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................
标题中的"S2SH+compass"指的是使用Struts2(S),Spring(S)和Hibernate(H)这三种开源框架的组合,再加上Compass搜索引擎库来实现一个网站内部的全文检索功能。这种组合常见于Java Web开发中,用于构建复杂、高...
例如,使用Compass将数据库中的数据同步到Lucene索引中,然后通过Ajax实现前端与后端的无刷新通信,当用户在搜索框中输入关键词时,立即向服务器发送请求,服务器利用Lucene进行查询,并用Ajax返回结果,这样就能在...
struts2+spring3+hibernate3+compass实现全文检索功能,希望对初学者有所帮助!
总结起来,结合`SASS`和`Compass`,我们可以更方便地创建和管理基于`rem`单位的雪碧图,以实现更加灵活和响应式的网页设计。`Rem`单位的使用确保了在整个页面中的比例一致性,而雪碧图技术则提高了页面加载速度,...
【SSH+Compass搜索引擎简单项目】是一个基于Struts2(S),Hibernate(H)和Spring(S)的Java Web应用程序,结合了Compass搜索引擎库,用于实现对数据库中两个表的高效检索功能。这个项目旨在提供一个清晰易懂的...
SSH2和Compass整合构建搜索引擎是一个在Java Web开发中实现高效全文检索的常见技术实践。SSH2是指Spring、Struts2和Hibernate这三个开源框架的组合,它们分别负责控制层、表现层和持久层的处理。而Compass是一个基于...
在本项目中,"JAVA 全文搜索 struts2+spring+hibernate+compass整合记录" 是一个关于如何在Java环境下集成四个关键组件来实现全文搜索引擎的实践教程。Struts2是一个流行的MVC框架,Spring是核心的依赖注入框架,...
Compass能够自动索引和搜索持久化对象,使得在Web应用中实现高效的数据检索变得简单。它支持实时索引更新,对数据库中的数据变化作出快速响应。 在提供的文件列表中,我们可以看到以下几个关键组件: - **compass-...
标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...