淘淘商城系列——匯入商品資料到索引庫
上文我們把商品資料匯入到索引庫中的Service層程式碼編寫完了,本文我們將再來把商品資料匯入到索引庫中的表現層程式碼編寫完,從而實現從資料庫中匯入商品資料到索引庫的功能。
我們是要在表現層中調用搜索服務的匯入資料功能的,但應在哪個表現層呼叫呢?很顯然應該在後臺管理系統——taotao-manager-web工程中調用搜索服務的匯入資料功能。既然服務已經發布過了,那麼我們現在只須引用服務即可,在taotao-manager-web工程中的springmvc.xml檔案新增如下配置。
<dubbo:reference interface="com.taotao.search.service.SearchItemService" id="searchItemService" />
我們知道,在預設的後臺管理頁面當中是沒有匯入資料到索引庫頁面的,這就需要我們自己建立這麼一個管理頁面。不過首先我們需要在後臺首頁新增一個導航,如下圖所示,當點選”匯入索引庫”的時候會去找index-manager.jsp這個頁面。
接著我們便去新建index-manager.jsp這麼一個頁面,如下圖所示。
為方便大家複製,現將index-manager.jsp頁面的內容貼出。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<div>
<a class="easyui-linkbutton" onclick="importItems()">一鍵匯入商品資料到索引庫</a>
</div>
<script type="text/javascript">
function importItems() {
$.post("/index/import",null,function(data){
if (data.status == 200) {
$.messager.alert('提示' ,'商品資料匯入完成!');
} else {
$.messager.alert('提示','商品資料匯入失敗!');
}
});
}
</script>
寫好了頁面,下面我們便來寫一下Controller,由於taotao-manager-web工程依賴taotao-search-interface,因此需要新增對該工程的依賴,如下圖所示。
接下來我們在taotao-manager-web工程中新建一個IndexManagerController,專門處理匯入商品資料到索引庫,如下圖所示。
為方便大家複製,現將IndexManagerController類的程式碼貼出。
/**
* 索引庫維護Controller
* <p>Title: IndexManagerController</p>
* <p>Description: </p>
* <p>Company: www.itcast.cn</p>
* @version 1.0
*/
@Controller
public class IndexManagerController {
@Autowired
private SearchItemService searchItemService;
@RequestMapping("/index/import")
@ResponseBody
public TaotaoResult indexImport() throws Exception {
TaotaoResult taotaoResult = searchItemService.importAllItemToIndex();
return taotaoResult;
}
}
這樣,我們的程式碼終於寫完了,接下來我們要做的便是啟動各個工程了。由於在taotao-common工程中新添加了一個pojo,因此taotao-common工程需要重新打包,打包方式就不說了,我都說爛了。還有taotao-search聚合工程是個新工程,也需要打包到本地maven倉庫。
接著我們來啟動各個工程,要注意的是在啟動工程前,我們千萬不要忘記開啟zookeeper伺服器!先啟動taotao-manager工程,接著啟動taotao-content工程,接著啟動taotao-search工程,由於taotao-search工程還沒有配置tomcat外掛啟動,因此需要先配置一下,方法是在工程上右鍵→Run As→Maven build…,會看到如下圖所示的對話方塊,在Goals一欄輸入”clean tomcat7:run”。然後點選”Apply”,之後點選”Run”啟動該工程。
啟動完taotao-search工程之後,我們再啟動taotao-manager-web工程,啟動完之後,我們看下後臺管理頁面,可以看到有匯入索引庫頁面,如下圖所示。
我們點選上圖的”一鍵匯入商品資料到索引庫”,會看到如下所示錯誤資訊。
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.taotao.search.mapper.ItemMapper.getItemList
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:189)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:43)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51)
at com.sun.proxy.$Proxy31.getItemList(Unknown Source)
at com.taotao.search.service.impl.SearchItemServiceImpl.importAllItemToIndex(SearchItemServiceImpl.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy33.importAllItemToIndex(Unknown Source)
at com.alibaba.dubbo.common.bytecode.Wrapper0.invokeMethod(Wrapper0.java)
at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
是什麼原因造成這個錯誤的呢?這是由於預設情況下mybatis所對應的mapper.xml檔案是不被載入的,如下圖所示,我們到taotao-search-service的mapper目錄下,發現只有ItemMapper.class檔案沒有ItemMapper.xml檔案,沒有xml檔案,當然執行就不成功了。
那麼解決方法是什麼呢?我們到taotao-search-service工程的pom.xml檔案中去簡單做下配置即可,如下圖所示,新增build配置,在<resources></resources>
當中需要新增兩個<resource>
,因為第一個<resource>
只是把src/main/java目錄包含進去了,這樣就會導致src/main/resources目錄被忽略掉了,而在我們的taotao-search-service工程中src/main/resources目錄下是有很多配置檔案的,它是不能忽略的,因此需要把src/main/resources目錄也包含進去,這也就是第二個<resource>
所要做的事情。
既然修改了taotao-search-service工程,我們便要重啟該服務,重啟後,我們再到如下圖所示的目錄下檢視ItemMapper.xml檔案是否已經生成,發現已經生成了。
下面我們再點選”一鍵匯入商品資料到索引庫”按鈕,等待一會兒,就會看到如下圖所示的提示資訊,說明匯入成功。
我們再到solr網頁去檢視匯入的資料,發現確實查詢到了,說明我們的匯入功能成功了。