关于如何建立compass索引为项目的相对路径问题,最初是在本地测试,可以随意建立索引位置, 但是如果借用虚拟主机来发布项目,则不行,原因是虚拟主机并不能给我们随意访问磁盘的权限。本次项目是在spring中整合compass,最初的本地测试:compass在spring的配置内容如下:
<?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" 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/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <context:component-scan base-package="com.asm" /> <bean id="localEMF" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="jpaDemo" /> </bean> <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="localEMF" /> </bean> <tx:annotation-driven transaction-manager="txManager" /> <!-- compass扫描相关的配置 start --> <bean id="compass" class="org.compass.spring.LocalCompassBean"> <!-- 指定映射类方式 --> <property name="classMappings"> <list> <value>com.asm.product.entity.Axx</value> <value>com.asm.product.entity.Bxx</value> </list> </property> <property name="compassSettings"> <props> <!-- 索引存放位置 --> <prop key="compass.engine.connection"> file://e:/indexStore </prop> <prop key="compass.engine.highlighter.default.formatter.simple.pre"><![CDATA[<font color='red'>]]></prop> <prop key="compass.engine.highlighter.default.formatter.simple.post"><![CDATA[</font>]]></prop> <prop key="compass.transaction.factory"> org.compass.spring.transaction.SpringSyncTransactionFactory </prop> </props> </property> <property name="transactionManager" ref="txManager" /> </bean> <!-- CompassGps为CompassGpsDevice提供Compass对象,他们一起为程序提供索引的实时更新 --> <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"> <!-- 为gpsDevice属性注入针对JPA的GPS驱动 --> <bean class="org.compass.gps.device.jpa.JpaGpsDevice"> <property name="name" value="jpaDevice" /> <property name="entityManagerFactory" ref="localEMF" /> <property name="injectEntityLifecycleListener" value="true" /> </bean> </property> </bean> </list> </property> </bean> <!-- compass扫描相关的配置 end --> </beans>
这样配置后,在本地索引肯定没问题,但是我们无论如何修改
<prop key="compass.engine.connection"> file://e:/indexStore </prop>
这段配置,它生成的索引路径总会是依赖于它的一个绝对路径,并不会依赖于当前项目中生成一个相对路径的索引,由于本身对compass认识并不深刻,加之并没有时间认真去看它的一些源码,这里只简要地就说下关于索引建立时compass的处理方式:如果你指定了connection配置来建立索引位置,它就会根据它的值来作为相对路径来生成索引的绝对路径。即只需在项目中为如果你配置了org.compass.spring.LocalCompassBean bean对象增加如下配置:
<!-- 索引存放位置 --> <property name="connection"> <value>/indexStore</value> </property>
这样建立的索引位置就是一个相对路径。至此问题解决。
但是这样配置后,也引发了项目中的一个小问题,在项目中用到了ajax异步交互,而ajax后台处理程序是servlet,最开始是直接写了一个工具类LogicBeanUtil来得到要用得业务层bean,但是继续使用它来处理,又存在初始化spring容器错误,由于spring容器中配置的connection[compass索引]依赖于整个web容器,而最初我涉及的logicBeanUtil是脱离了web容器,所以这样做并不能得到业务层bean对象,其实在servlet中可以有一很方便的方式注入业务层对象,代码如下:
WebApplicationContext ctx = WebApplicationContextUtils .getWebApplicationContext(getServletContext()); UserService userService = (UserService) ctx.getBean("userServiceBean");
至此问题得已解决。