2010小问题解决汇总跟贴

      关于如何建立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");

 至此问题得已解决。

 

你可能感兴趣的:(spring,Ajax,bean,orm,jpa)